Gemäß der Microsoft-Dokumentation zu UniqueIdentifier ist dieser Wert immer global eindeutig, da er auf der Netzwerkuhr und der CPU-Uhrzeit basiert und andererseits in derselben Dokumentation angegeben ist
Uniqueidentifier-Spalten können mehrere Vorkommen eines einzelnen Uniqueidentifier-Werts enthalten, es sei denn, für die Spalte sind auch die Einschränkungen UNIQUE oder PRIMARY KEY angegeben.
Ich kann nicht zu dem Schluss kommen, wie UniqueIdentifier (GUIDs) global eindeutig sein kann, da die Netzwerkadresse (Mac-Adresse) in zwei verschiedenen Netzwerken identisch sein kann, wie GUIDs global eindeutig sein können, mit welchen Kombinationen und warum Microsoft dort sagt sollte eine primäre oder eindeutige Einschränkung sein, um sicherzustellen, dass immer ein eindeutiger UniqueIdeitifer-Wert vorhanden ist.
https://technet.microsoft.com/en-us/library/ms190215(v=sql.105).aspx
quelle
UNIQUE
Einschränkung.Antworten:
Problem Nr. 1
Das Hauptproblem hierbei ist, dass Sie zwei verschiedene Dinge als zwei Begriffe verwechseln, die sich auf eine Sache beziehen: UNIQUEIDENTIFIER und GUIDs.
UNIQUEIDENTIFIER
ist ein Datentyp. Datentypen definieren die Art der Daten, die sie (dh Spalten und Variablen dieses Typs) enthalten können (z. B. Min / Max-Werte usw.), und bestimmte Verhaltensweisen der Daten (z. B. Umgang mit Vergleichen). Dieser besondere Datentyp nur hält GUID / UUID - Werte. Da es sich jedoch nicht um Daten handelt, gilt das Konzept der Einzigartigkeit nicht für diese. Und das Wort "Unique" im Namen "UniqueIdentifier" ist kein Versprechen oder gar keine Aussage über die tatsächliche Einzigartigkeit.GUIDs / UUIDs sind tatsächliche Werte, die als gespeichert werden können
UNIQUEIDENTIFIER
, aber auch alsVARBINARY
/BINARY
,(N)VARCHAR
/(N)CHAR
und möglicherweise als einige andere gespeichert werden können . Während derUNIQUEIDENTIFIER
Datentyp die beste Wahl (in SQL Server) zum Speichern dieser Werte ist, werden die Werte durch das Speichern der Werte in den anderen Typen nicht mehr oder weniger eindeutig.Problem Nr. 2
Das zweite Problem hierbei ist, dass Sie tatsächlich einen technischen Fehler in der Dokumentation akzeptieren, mit der Sie verlinkt haben. Ich gehe davon aus, dass Sie sich auf diese Aussage beziehen:
Diese Anweisung bezieht sich auf Funktionen wie
NEWID()
in T-SQL undGuid.NewGuid()
in .NET, die neue GUID / UUID-Werte erstellen, und die Absicht , immer eindeutige Werte zu generieren. Dies ist jedoch nicht der Fall : Es wird nicht garantiert , dass neu generierte GUIDs eindeutig sind. Wie Sie bereits betont haben, sind MAC-Adressen nicht unbedingt eindeutig (sie können sogar gefälscht werden; weitere Informationen finden Sie im Abschnitt "Verwandte Informationen" weiter unten). Auch aus anderen Microsoft-Dokumentationen:MSDN-Seite für .NET Guid Strukturzustände (Hervorhebung hinzugefügt):
Die .NET Guid.NewGuid () -Methode (mit der neue GUID / UUID-Werte generiert werden) ruft Win32Native.CoCreateGuid auf . In der Dokumentation zu dieser Funktion heißt es (Hervorhebung hinzugefügt):
Bitte beachten Sie, dass in der Nicht-SQL Server-Dokumentation nicht einmal die MAC-Adresse erwähnt wird. Und die Dokumentation für
CoCreateGuid
verweist auf die eigentliche Funktion, die die Generierung ausführt : UuidCreate . In der Dokumentation zu dieser Funktion heißt es:Dies impliziert, dass die MAC-Adresse speziell nicht verwendet wird (außer bei Verwendung
NEWSEQUENTIALID()
). Tatsächlich bedeutet das Generieren einiger GUIDs in SQL Server überNEWID()
, dass es sich um RFC 4122- UUIDs der Version 4 handelt , die höchstwahrscheinlich eindeutig sind. Hier gibt es ein Diagramm mit der zufälligen UUID-Wahrscheinlichkeit von Duplikaten , das zeigt, wie unwahrscheinlich es ist, dass Duplikate vorhanden sind. Selbst eine sehr, sehr geringe Wahrscheinlichkeit von Duplikaten ist jedoch keine Garantie für die Eindeutigkeit.Und so...
Es gibt keine Garantie dafür, dass neu generierte GUID / UUID-Werte eindeutig sind. Und selbst wenn es eine Garantie gäbe , hätte der
UNIQUEIDENTIFIER
Datentyp immer noch nichts mit der tatsächlichen Eindeutigkeit zu tun (wie in Brents Antwort gezeigt). Die Eindeutigkeit für eine oder mehrere Spalten (dh Daten, keine Datentypen) kann nur durch eindeutige Indizes / Einschränkungen erzwungen werden.Verwandte Informationen:
quelle
Weil in einer UNIQUEIDENTIFIER-Spalte der von Ihnen eingegebene UNIQUEIDENTIFIER gespeichert werden kann. Nehmen Sie diesen Code:
Nichts hindert Sie daran - es sei denn, Sie geben etwas an der Tabelle an, das die Eindeutigkeit erzwingt.
quelle