web-dev-qa-db-fra.com

Mettre à jour les valeurs dans la colonne d'identité

Comment remplacer la colonne d'identité dans MSSQL? J'ai essayé :

SET IDENTITY_INSERT GeoCountry ON
UPDATE GeoCountry SET CountryID = 18 WHERE CountryID = 250

Mais je récupère un 

Line 2: Cannot update identity column 'CountryID'.
29
lowerkey

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

Pour ce faire, vous devez définir identity_insert ON et copier la ligne que vous souhaitez mettre à jour sur une nouvelle ligne avec la nouvelle valeur d'ID, puis supprimer l'ancienne ligne (en supposant qu'aucun FK ne la référence).

Quelque chose dans le genre 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, cela suggérerait qu'il est toujours utilisé (c'est-à-dire en faisant référence à des FK) et cela rend les choses plus compliquées ...]

58
Mitch Wheat

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 Identité, car la mise à jour d'une valeur d'identité n'est pas prise en charge.

set Identity_Insert [ColumnName] On Insère l'identité et les informations supplémentaires précédemment stockées dans cet enregistrement set Identity_Insert [ColumnName] Off

10
Gary J.

Si vous essayez de mettre à jour une colonne d’identité, voici une approche possible:

  • Dans SQL Server Management Studio, ouvrez la table en mode création, désactivez "Spécification d'identité> est identité" sur la colonne
  • Effectuer des mises à jour
  • Activer "Spécification d'identité> l'identité est" sur la colonne

Effectuez SELECT IDENT_CURRENT('<table name>') pour voir s’il renvoie l’id le plus élevé présent dans la table.

10
Salman A

Vous pouvez également le faire dans une instruction en utilisant delete into. Cela présente l'avantage d'éliminer toute erreur de copie/déplacement des données de ligne, par exemple.

set identity_insert [dbo].[MyTableName] on

delete from [dbo].[MyTableName]
output 
<new-id-value-here>,
[deleted].[Col1], 
[deleted].[Col2], 
[deleted].[Col3], 
into 
[dbo].[MyTableName] (
[IdColumnName], 
[Col1], 
[Col2], 
[Col3])
where
[IdColumnName]=<old-id-value-here>

set identity_insert [dbo].[MyTableName] off
1
Ismail Hawayel

Si vous souhaitez ré-énumérer les valeurs d'un champ d'identité, parce que, par exemple, les valeurs sont devenues folles, procédez comme suit:

  • ouvrir la table en mode conception. Cliquez sur Spécification d'identité.

    marque (est identité) en tant que NO (votre champ d'identité est toujours un PK)

    fermer et sauvegarder le design

  • ouvrir la table en mode édition Modifiez les valeurs de votre champ Identity comme vous le souhaitez

  • Fermez la table et ouvrez-la à nouveau en mode Création .__ Remplacez le champ d'identité (is identity) par Yes.

    Fermez la table et vous avez terminé.

0
Ramon Baiges