Comment ajouter la propriété identity à une colonne existante dans SQL Server

dans SQL Server (dans mon cas, 2005) Comment puis-je ajouter la propriété identity à une colonne table existante en utilisant T-SQL?

quelque Chose comme:

alter table tblFoo 
    alter column bar identity(1,1)
34
demandé sur marc_s 2008-11-13 23:47:11

5 réponses

Je ne crois pas que tu puisses faire ça. Votre meilleur pari est de créer une nouvelle colonne identity et de copier les données en utilisant une commande identity insert (si vous voulez vraiment garder les anciennes valeurs).

voici un article décent décrivant le processus en détail: http://www.mssqltips.com/tip.asp?tip=1397

30
répondu JohnFx 2008-11-13 20:59:46

la solution Postée par Vikash ne fonctionne pas; elle produit une erreur de "syntaxe incorrecte" Dans SQL Management Studio (2005, comme L'OP spécifié). Le fait que l '"édition compacte" de SQL Server supporte ce type d'opération n'est qu'un raccourci, parce que le processus réel ressemble plus à ce que Robert & JohnFX ont dit: créer une table dupliquée, peupler les données, renommer les tables originales & nouvelles de manière appropriée.

Si vous souhaitez conserver les valeurs qui existent déjà dans le champ de doit être une identité, vous pourriez 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, laisser tomber et recréer une table (tname1) qui est utilisée par code en direct N'est pas recommandé! :)

12
répondu NateJ 2009-05-26 21:14:21

la table est-elle peuplée? Si ce n'est pas tomber et recréer la table.

si elle est peuplée, quelles valeurs existent déjà dans la colonne? Si ce sont des valeurs que vous ne souhaitez pas conserver.

créer une nouvelle table comme vous le désirez, charger les enregistrements de votre ancienne table dans votre nouvelle talbe et laisser la base de données peupler la colonne d'identité comme normale. Renommez votre table originale et renommez la nouvelle au nom correct :).

Enfin, si la colonne que vous souhaitez faire identity contient actuellement des valeurs clés primaires et est déjà référencé par d'autres tables vous aurez besoin de réfléchir totalement si vous êtes sûr que c'est ce que vous voulez faire :)

2
répondu Robert 2008-11-14 12:08:36

Il n'y a aucun moyen direct de le faire sauf:

A) par SQL i.e.:

-- 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 MSSMS qui fera exactement la même chose en arrière-plan mais moins de gros doigtés.

  • dans L'Explorateur D'objets mssms cliquez avec le bouton droit de la souris sur la table que vous devez modifier
  • sélectionnez "design" sélectionnez la colonne que vous souhaitez ajouter identité à
  • changer le paramètre d'identité de non - > oui (peut-être graine)
  • Ctr+S le tableau

enter image description here

supprimer et recréer le tableau avec toutes les données d'origine. Si vous obtenez un avertissement:

enter image description here

Go to MSSMS Outils -> Options -> les Concepteurs -> Table et des Concepteurs de base de données et décochez l'option "empêcher de sauvegarder les modifications qui nécessitent une table re-création"

choses à surveiller:

  1. votre base de données a assez d'espace disque avant que vous ne le fassiez
  2. le DB n'est pas en cours d'utilisation (en particulier la table vous sont en train de changer)
  3. assurez-vous de sauvegarder votre base de données avant de le faire
  4. si la table a beaucoup de données (plus de 1G) essayez-la ailleurs d'abord avant d'utiliser en REAL DB
0
répondu Milan 2017-01-25 19:50:45
alter table tablename 
alter column columnname 
add Identity(100,1)
-5
répondu a_m0d 2011-10-14 19:51:16