web-dev-qa-db-fra.com

Comment ajouter la propriété d'identité à une colonne existante dans SQL Server

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)
35
Tristan Havelick

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

31
JohnFx

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é! :)

12
NateJ

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 :)

2
Robert

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.

  • Dans l'Explorateur d'objets MSSMS, cliquez avec le bouton droit sur la table que vous devez modifier
  • Sélectionnez "conception" Sélectionnez la colonne à laquelle vous souhaitez ajouter l'IDENTITÉ
  • Modifiez le paramètre d'identité de NON -> OUI (éventuellement initial)
  • Ctr + S la table

enter image description here

Cela supprimera et recréera le tableau avec toutes les données d'origine. Si vous recevez un avertissement:

enter image description here

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:

  1. votre base de données a suffisamment d'espace disque avant de le faire
  2. la base de données n'est pas utilisée (en particulier la table que vous modifiez)
  3. assurez-vous de sauvegarder votre base de données avant de le faire
  4. si la table contient beaucoup de données (plus de 1 G), essayez-la ailleurs avant de l'utiliser dans une vraie base de données
0
Milan
  1. Créer une nouvelle table

    SELECT * INTO Table_New FROM Table_Current WHERE 1 = 0;
    
  2. Supprimer la colonne d'une nouvelle table

    Alter table Table_New drop column id;
    
  3. Ajouter une colonne avec une identité

    Alter table Table_New add id int primary key identity; 
    
  4. 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;
    
  5. Déposer l'ancienne table

    drop table Table_Current;
    
  6. Renommer une nouvelle table en ancienne table

    EXEC sp_rename 'Table_New', 'Table_Current';
    
0
Anuj Kumar