Utilisation des données uniqueidentifier

Le type de données uniqueidentifier stocke des valeurs binaires codées sur 16 octets qui fonctionnent comme des identificateurs globaux uniques (GUID). Un GUID est un nombre binaire unique ; aucun autre ordinateur dans le monde ne génèrera un doublon de cette valeur GUID. Un GUID est principalement utilisé pour assigner un identificateur qui doit être unique dans un réseau qui comprend de nombreux ordinateurs répartis sur plusieurs sites.

Une valeur GUID pour une colonne uniqueidentifier est généralement obtenue de l'une des manières suivantes :

  • dans une instruction, un traitement ou un script Transact-SQL en appelant la fonction NEWID ;

  • dans le code d'une application en appelant une fonction ou une méthode d'application API qui renvoie un GUID.

La fonction Transact-SQL NEWID et les fonctions et méthodes de l'API d'application génèrent de nouvelles valeurs uniqueidentifier à partir du numéro d'identification de leur carte réseau plus un numéro unique à partir de l'horloge de l'UC. Chaque carte réseau possède un numéro d'identification unique. La valeur uniqueidentifier renvoyée par NEWID est générée par le biais de la carte réseau sur le serveur. La valeur uniqueidentifier renvoyée par les fonctions et les méthodes de l'API d'application est générée par le biais de la carte réseau du client.

Une valeur uniqueidentifier n'est pas généralement définie comme constante. Vous pouvez spécifier une constante uniqueidentifier comme suit :

  • Format chaîne de caractères : '6F9619FF-8B86-D011-B42D-00C04FC964FF'

  • Format binaire : 0xff19966f868b11d0b42d00c04fc964ff

Le type de données uniqueidentifier ne génère pas automatiquement de nouveaux ID pour des lignes insérées comme le fait la propriété IDENTITY. Par exempe, pour obtenir de nouvelles valeurs uniqueidentifier, une table doit avoir une clause DEFAULT précisant la fonction NEWID ou NEWSEQUENTIALID ou des instructions INSERT doivent utiliser la fonction NEWID.

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

[!REMARQUE]

Vous pouvez utiliser NEWSEQUENTIALID pour générer des GUID pour réduire les conflits de pages au niveau feuille des index. NEWSEQUENTIALID peut être utilisé uniquement avec des contraintes DEFAULT sur des colonnes de table de type uniqueidentifier.

Les colonnes uniqueidentifier peuvent contenir des occurrences multiples d'une même valeur uniqueidentifier, à moins que les contraintes UNIQUE ou PRIMARY KEY ne soient spécifiées pour la colonne. Une colonne de clé étrangère qui fait référence à une clé primaire uniqueidentifier dans une autre table a des occurrences multiples de valeurs uniqueidentifier individuelles lorsque plusieurs lignes font référence à la même clé primaire dans la table source.

Une table peut avoir plusieurs colonnes uniqueidentifier. Une seule colonne uniqueidentifier pour chaque table peut être spécifiée avec la propriété ROWGUIDCOL. Cette dernière indique que les valeurs uniqueidentifier dans la colonne identifient de façon unique les lignes de la table. Toutefois, la propriété ne fait rien pour appliquer cela. Le caractère d'unicité doit être renforcé par d'autres mécanismes, tels que la spécification de la contrainte PRIMARY KEY pour la colonne. La propriété ROWGUIDCOL est avant tout utilisée par la réplication MicrosoftSQL Server. La réplication de fusion et la réplication transactionnelle avec abonnements mis à jour utilisent des colonnes uniqueidentifier afin de s'assurer que les lignes sont identifiées de manière unique parmi les multiples copies de la table.

Le type de données uniqueidentifier présente les inconvénients suivants :

  • Les valeurs sont longues et peu intelligibles. Il est donc difficile pour les utilisateurs de les entrer correctement, et il est encore plus difficile pour eux de s'en souvenir.

  • Les valeurs sont déterminées au hasard et ne peuvent accepter aucun modèle qui puisse les rendre plus significatives pour les utilisateurs.

  • Il n'existe aucun moyen de déterminer l'ordre dans lequel les valeurs uniqueidentifier ont été générées. Elles ne sont pas adaptées aux applications existantes qui dépendent de valeurs de clés incrémentées en séquence.

  • Avec le codage sur 16 octets, le type de données uniqueidentifier est relativement grand par rapport à d'autres types de données tels que les entiers codés sur 4 octets. Par conséquent, les index créés à l'aide de clés uniqueidentifier peuvent être relativement plus lents que ceux utilisant une clé de type int.

Utilisez la propriété IDENTITY lorsque le caractère d'unicité globale n'est pas nécessaire ou lorsqu'il est préférable d'avoir une clé s'incrémentant en séquence.