Verwenden von uniqueidentifier-Daten

Der uniqueidentifier-Datentyp speichert aus 16 Bytes bestehende Binärwerte, die als GUIDs (Globally Unique Identifier) fungieren. Ein GUID ist eine eindeutige Binärzahl; kein anderer Computer auf der Welt generiert einen GUID-Wert, den es schon einmal gibt. Der Hauptverwendungszweck eines GUID besteht in der Zuweisung einer ID, die in einem Netzwerk eindeutig sein muss, das zahlreiche Computer an zahlreichen Standorten enthält.

Ein GUID-Wert für eine uniqueidentifier-Spalte kann in der Regel auf eine der folgenden Arten abgerufen werden:

  • In einer Transact-SQL-Anweisung, einem -Batch oder -Skript durch Aufrufen der NEWID-Funktion.

  • Im Anwendungscode durch Aufrufen einer Anwendungs-API-Funktion oder -Methode, die einen GUID zurückgibt.

Die Transact-SQL-Funktion NEWID und die Funktionen und Methoden der Anwendungs-API generieren neue uniqueidentifier-Werte aus der ID ihrer Netzwerkkarte sowie aus einer eindeutigen Zahl, die von der CPU-Uhr stammt. Jede Netzwerkkarte verfügt über eine eindeutige Identifikationsnummer. Der von NEWID zurückgegebene uniqueidentifier-Wert wird mithilfe der Netzwerkkarte auf dem Server generiert. Der von Funktionen und Methoden der Anwendungs-API zurückgegebene uniqueidentifier-Wert wird mithilfe der Netzwerkkarte auf dem Client generiert.

Ein uniqueidentifier-Wert wird normalerweise nicht als Konstante definiert. Es gibt folgende Möglichkeiten, um eine uniqueidentifier-Konstante anzugeben:

  • Zeichenfolgenformat: '6F9619FF-8B86-D011-B42D-00C04FC964FF'

  • Binärformat: 0xff19966f868b11d0b42d00c04fc964ff

Der uniqueidentifier-Datentyp generiert nicht wie die IDENTITY-Eigenschaft automatisch neue IDs für eingefügte Zeilen. Damit neue uniqueidentifier-Werte abgerufen werden, muss z. B. eine Tabelle über eine DEFAULT-Klausel verfügen, die die NEWID- oder die NEWSEQUENTIALID-Funktion angibt, oder INSERT-Anweisungen müssen die NEWID-Funktion verwenden.

CREATE TABLE MyUniqueTable
   (UniqueColumn   UNIQUEIDENTIFIER      DEFAULT NEWID(),
   Characters      VARCHAR(10) )
GO
INSERT INTO MyUniqueTable(Characters) VALUES ('abc')
INSERT INTO MyUniqueTable VALUES (NEWID(), 'def')
GO
HinweisHinweis

Sie können GUIDs mithilfe von NEWSEQUENTIALID generieren, um Seitenkonflikte auf der Blattebene von Indizes zu reduzieren. NEWSEQUENTIALID kann nur mit DEFAULT-Einschränkungen für Tabellenspalten vom Typ uniqueidentifier verwendet werden.

uniqueidentifier-Spalten können mehrere Vorkommen eines einzelnen uniqueidentifier-Werts enthalten; es sei denn, die UNIQUE- oder PRIMARY KEY-Einschränkungen werden ebenfalls für die Spalte angegeben. Eine Fremdschlüsselspalte, die auf einen uniqueidentifier-Primärschlüssel in einer anderen Tabelle verweist, enthält mehrere Stellen mit einzelnen uniqueidentifier-Werten, wenn mehrere Zeilen auf den gleichen Primärschlüssel in der Quelltabelle verweisen.

Eine Tabelle kann mehrere uniqueidentifier-Spalten enthalten. Eine uniqueidentifier-Spalte für jede Tabelle kann mit der ROWGUIDCOL-Eigenschaft angegeben werden. Die ROWGUIDCOL-Eigenschaft zeigt an, dass die uniqueidentifier-Werte in der Spalte die Zeilen in der Tabelle eindeutig kennzeichnen. Die Eigenschaft selbst erzwingt diese eindeutige Kennzeichnung jedoch nicht. Die Eindeutigkeit muss durch Verwendung anderer Mechanismen erzwungen werden, wie z. B. durch Angabe der PRIMARY KEY-Einschränkung für die Spalte. Die ROWGUIDCOL-Eigenschaft wird hauptsächlich von der MicrosoftSQL Server-Replikation verwendet. Die Merge- und die Transaktionsreplikation, die über Abonnements mit Aktualisierung verfügen, verwenden uniqueidentifier-Spalten. Dadurch wird sichergestellt, dass Zeilen über mehrere Kopien der Tabelle hinweg eindeutig identifiziert werden.

Der uniqueidentifier-Datentyp weist die folgenden Nachteile auf:

  • Die Werte sind lang und undurchsichtig. Dies erschwert Benutzern die richtige Eingabe und macht es noch schwerer, sich die Werte zu merken.

  • Die Werte werden auf Zufallsbasis generiert und können daher keine Muster übernehmen, durch die die Werte für die Benutzer aussagekräftiger werden können.

  • Es gibt keine Möglichkeit, die Reihenfolge zu ermitteln, in der uniqueidentifier-Werte generiert wurden. Sie sind nicht für vorhandene Anwendungen geeignet, die von sich seriell erhöhenden Schlüsselwerten abhängen.

  • Mit 16 Bytes ist der uniqueidentifier-Datentyp relativ groß im Vergleich zu anderen Datentypen, wie z. B. ganzzahligen Werten mit 4 Byte. Dies bedeutet, dass mit uniqueidentifier-Schlüsseln erstellte Indizes langsamer sein können als Indizes, die einen int-Schlüssel verwenden.

Ziehen Sie das Verwenden der IDENTITY-Eigenschaft in Betracht, wenn keine globale Eindeutigkeit erforderlich ist oder wenn ein sich seriell erhöhender Schlüssel bevorzugt wird.