Dans SQL Server (dans mon cas, 2005), comment puis-je ajouter la propriété d'identité à une colonne de table existante à l'aide de T-SQL?
Quelque chose comme:
alter table tblFoo
alter column bar identity(1,1)
Je ne crois pas que tu puisses faire ça. Le mieux est de créer une nouvelle colonne d'identité et de copier les données à l'aide d'une commande d'insertion d'identité (si vous souhaitez en effet conserver les anciennes valeurs).
Voici un article décent décrivant le processus en détail: http://www.mssqltips.com/tip.asp?tip=1397
La solution publiée par Vikash ne fonctionne pas; il produit une erreur de "syntaxe incorrecte" dans SQL Management Studio (2005, comme l'OP spécifié). Le fait que la "Compact Edition" de SQL Server prend en charge ce type d'opération n'est qu'un raccourci, car le processus réel ressemble plus à ce que Robert et JohnFX ont dit - créer une table en double, remplir les données, renommer les tables originales et nouvelles de manière appropriée.
Si vous souhaitez conserver les valeurs qui existent déjà dans le champ qui doit être une identité, vous pouvez faire quelque chose comme ceci:
CREATE TABLE tname2 (etc.)
INSERT INTO tname2 FROM tname1
DROP TABLE tname1
CREATE TABLE tname1 (with IDENTITY specified)
SET IDENTITY_INSERT tname1 ON
INSERT INTO tname1 FROM tname2
SET IDENTITY_INSERT tname1 OFF
DROP tname2
Bien sûr, supprimer et recréer une table (tname1) qui est utilisée par code en direct n'est PAS recommandé! :)
La table est-elle remplie? Sinon, supprimez et recréez la table.
S'il est renseigné, quelles valeurs existent déjà dans la colonne? S'il s'agit de valeurs que vous ne souhaitez pas conserver.
Créez une nouvelle table comme vous le souhaitez, chargez les enregistrements de votre ancienne table dans votre nouveau talbe et laissez la base de données remplir la colonne d'identité comme d'habitude. Renommez votre table d'origine et renommez la nouvelle au nom correct :).
Enfin, si la colonne que vous souhaitez créer l'identité contient actuellement des valeurs de clé primaire et est déjà référencée par d'autres tables, vous devrez totalement repenser si vous êtes sûr que c'est ce que vous voulez faire :)
Il n'y a aucun moyen direct de le faire, sauf:
A) via SQL c'est-à-dire:
-- make sure you have the correct CREATE TABLE script ready with IDENTITY
SELECT * INTO abcTable_copy FROM abcTable
DROP TABLE abcTable
CREATE TABLE abcTable -- this time with the IDENTITY column
SET IDENTITY_INSERT abcTable ON
INSERT INTO abcTable (..specify all columns!) FROM (..specify all columns!) abcTable_copy
SET INDENTITY_INSERT abcTable OFF
DROP TABLE abcTable_copy
-- I would suggest to verify the contents of both tables
-- before dropping the copy table
B) Par le biais de MSSMS qui fera exactement la même chose en arrière-plan mais sera moins fatigant.
Cela supprimera et recréera le tableau avec toutes les données d'origine. Si vous recevez un avertissement:
Accédez à MSSMS Outils -> Options -> Concepteurs -> Concepteurs de tables et de bases de données et décochez l'option "Empêcher l'enregistrement des modifications nécessitant une recréation de la table"
Choses à faire attention:
Créer une nouvelle table
SELECT * INTO Table_New FROM Table_Current WHERE 1 = 0;
Supprimer la colonne d'une nouvelle table
Alter table Table_New drop column id;
Ajouter une colonne avec une identité
Alter table Table_New add id int primary key identity;
Obtenir toutes les données dans une nouvelle table
SET IDENTITY_INSERT Table_New ON;
INSERT INTO Table_New (id, Name,CreatedDate,Modified)
SELECT id, Name,CreatedDate,Modified FROM Table_Current;
SET IDENTITY_INSERT Table_New OFF;
Déposer l'ancienne table
drop table Table_Current;
Renommer une nouvelle table en ancienne table
EXEC sp_rename 'Table_New', 'Table_Current';