2010-10-16 2 views

Répondre

55

Vous essayez d'effectuer une mise à jour, pas insérer de nouvelles lignes.

Pour ce faire, vous devez définir identity_insert ON et copier la ligne que vous souhaitez mettre à jour à une nouvelle ligne avec la nouvelle valeur d'ID, puis supprimez l'ancienne ligne (en supposant qu'aucun FK est référençant)

Quelque chose le long des lignes de:

set identity_insert GeoCountry on 
go 

insert into GeoCountry (all columns including IDentity column) 
    select 18, (all columns except IDentity column) 
    from GeoCountry where CountryID = 250 

-- Delete will only work if no referencing FK's 
delete GeoCountry where CountryID = 250 

set identity_insert GeoCountry off 
go 

[Étant donné que vous essayez de le mettre à jour, qui suggère qu'il est encore en cours d'utilisation (par exemple en faisant référence à FK de) et qui rend les choses plus compliquées ... ]

+0

Ceci est trop verbeux. Trop d'explications pour un simple "Vous ne pouvez pas". vous devez ré-insérer avec une nouvelle identité. –

+5

@Amir M .: Incorrect. –

10

Vous ne pouvez pas mettre à jour la colonne d'identité dans SQL Server. Vous devez supprimer l'enregistrement d'origine, puis Insérer l'enregistrement avec la valeur Identity car il n'existe aucun support pour la mise à jour d'une valeur d'identité.

set identity_insert [ColumnName] Sur identité Insérer et des informations supplémentaires précédemment stockées dans cet enregistrement ensemble Identity_Insert [ColumnName] Off

+2

+1 IMO c'est la bonne réponse. Lorsqu'on pose avec la question "Comment mettre à jour la valeur d'identité" c'est un détail important que vous ne pouvez en fait METTRE à jour la valeur mais devez SUPPRIMER et ré-INSÉRER. La réponse acceptée échoue à cet égard. – alan

10

Si vous essayez de mettre à jour une colonne d'identité est une approche possible ici:

  • dans SQL Server Management studio, ouvrez la table en vue de la conception, désactivez "Spécification Identity> est Identity" sur la colonne
  • Effectuer les mises à jour
  • activez l'option « Spécification Identity> est Identity » sur la colonne

Faites un SELECT IDENT_CURRENT('<table name>') pour voir si elle retourne le plus haut id qui est actuellement présente dans le tableau.

+0

Cette méthode est la meilleure façon d'aller si vous avez des clés étrangères avec des mises à jour en cascade, car vous obtenez les mises à jour pour "libre". – Jacob

-1

Vous ne pouvez pas mettre à jour une colonne d'identité existante. Cependant c'est la solution de contournement que j'utilise:

-- create copy of the existing table 
SELECT * INTO old_tablename FROM tablename 

-- delete everything in the original table 
DELETE FROM tablename 

-- temporarily allow updating identity columns 
SET IDENTITY_INSERT tablename ON; 

-- copy data into the existing table from the copy of the existing table 
-- modify the select statement to put whatever you want in the identity column 
-- of course you can join to other tables etc to get the int for your id column 
INSERT INTO tablename (
    id_column, 
    column2, 
    column3 
) SELECT 
    old_id, 
    column2, 
    column3 
FROM old_tablename; 

-- prevent updating identity columns in future 
SET IDENTITY_INSERT tablename OFF; 

-- drop the copied table once you've tested that everything worked ok 
-- DROP TABLE old_tablename 
+0

DELETE De nom_table supprimerait toutes les relations si la suppression en cascade était activée. Si vous n'aviez aucune relation, cela fonctionnerait, mais supprimer une table entière juste pour mettre à jour certains enregistrements ne semble pas être une bonne chose à faire. – ManOVision