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'.
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 ...]
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
Si vous essayez de mettre à jour une colonne d’identité, voici une approche possible:
Effectuez SELECT IDENT_CURRENT('<table name>')
pour voir s’il renvoie l’id le plus élevé présent dans la table.
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
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é.