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;
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;
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:
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.
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.
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}"