web-dev-qa-db-fra.com

La valeur par défaut est GUID dans la colonne de table SQL Server

J'ai besoin d'ajouter une colonne à une table existante et de la définir comme clé primaire. J'utilise un autre logiciel pour ajouter de nouvelles données. Pourquoi la colonne GIANGGUID a-t-elle la valeur 00000000-0000-0000-0000-000000000000?

ALTER TABLE dbo.Test 
   ADD [GIANGGUID] UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY;
13
Giang Nguyen

Plusieurs choses se passent ici. 

Si vous ajoutez simplement une colonne avec une valeur par défaut en utilisant cette requête:

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier DEFAULT NEWID();

Vous obtiendrez une valeur NULL pour les colonnes existantes, car NULL sont autorisées et newid () pour les nouvelles lignes insérées:

id  name    GIANGGUID
0   A       NULL
1   B       NULL
2   C       NULL

Maintenant, si vous ajoutez une nouvelle colonne avec NOT NULL:

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier NOT NULL DEFAULT NEWID();

Puisque la colonne ne peut pas être NULL, la contrainte DEFAULT est utilisée et newid () est inséré pour chaque ligne existante:

id  name    GIANGGUID
0   A       52C70279-B3A4-4DE6-A612-F1F32875743F
1   B       3005D9BE-5389-4870-BAA9-82E658552282
2   C       E50FDD26-A8FD-43BD-A8F0-3FDA83EFF5D9

La même chose se produit lorsque vous ajoutez une clé primaire car le PK ne peut pas être NULL et newid () sera également ajouté avec cet ALTER:

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier NOT NULL DEFAULT NEWID()-- PRIMARY KEY;
  • Avec votre requête, newid () sera inséré pour les lignes nouvelles et existantes.
  • Avec les autres requêtes ci-dessus, vous obtiendrez NULL ou newid ().

Il n'y a aucune raison de se retrouver avec 00000000-0000-0000-0000-000000000000 sauf si quelque chose qui n'a pas été mentionné le fait ou le transforme. 

Maintenant, si nous mettons ce problème de côté, vous ne devriez pas envisager d’utiliser UNIQUEIDENTIFIER comme clé primaire. GUID sont:

  • pas étroit
  • random bien que Sequential GUID puisse être utilisé.

Si vous avez besoin de quelque chose d’aléatoire et d’unique, tel qu'un GUID, dans votre table pour certaines raisons, vous pouvez conserver cette colonne sans clé de traitement et ajouter une colonne d’identification unique et séquentielle supplémentaire (bigint avec identité) en tant que clé de traitement.

Exemple de données:

CREATE TABLE #Test(id int, name varchar(10));
INSERT INTO #Test(id, name) values
    (0, 'A')
    , (1, 'B')
    , (2, 'C');

Edit pour contourner le problème d'insertion de logiciel ... (voir GUID de 00000000-0000-0000-0000-000000000000 provoquant la violation de l'index de fusion )

Renommez la table:

EXEC sp_rename 'dbo.test', 'test_data'

Ajouter la nouvelle colonne:

ALTER TABLE dbo.Test_data ADD [GIANGGUID] UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY;

ou:

ALTER TABLE dbo.Test_data ADD [GIANGGUID] bigint identity(0, 1) PRIMARY KEY;

Créer une vue sans GIANGGUID:

CREATE VIEW dbo.test AS
    SELECT col1, col2, ... FROM dbo.test_data

Lorsque le logiciel fera son insertion, il ne verra pas GIANGGUID et il n'essaiera pas d'insérer quelque chose automatiquement.

17
Julien Vavasseur

Avant d’utiliser une interface graphique en tant que primaire, vous devriez jeter un coup d’œil à cet article:

Il est généralement déconseillé d'utiliser un GUID comme clé primaire dans SQL Server.

0
Thomas

J'ai passé beaucoup de temps à essayer de comprendre cela. Il semble que vous ayez besoin du format suivant pour qu'une colonne dérivée soit un GUID. (DT_GUID) "{00000000-0000-0000-0000-000000000000}"

0
BilliD