Vous ne pouvez pas mettre à jour la colonne d'identité.
SQL Server ne permet pas de mettre à jour la colonne d'identité contrairement à ce que vous pouvez faire avec d'autres colonnes avec une instruction de mise à jour.
Bien qu'il existe des alternatives pour atteindre un type d'exigence similaire.
- Lorsque la valeur de la colonne Identité doit être mise à jour pour les nouveaux enregistrements
Utilisez DBCC CHECKIDENT qui vérifie la valeur d'identité actuelle pour la table et si nécessaire, modifie la valeur d'identité.
DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)
- Quand la valeur de la colonne Identité doit être mise à jour pour les enregistrements existants
Utilisez IDENTITY_INSERT qui permet d'insérer des valeurs explicites dans la colonne d'identité d'une table.
SET IDENTITY_INSERT YourTable {ON|OFF}
Exemple:
SET IDENTITY_INSERT YourTable ON
GO
INSERT INTO YourTable(IdentityCol, otherCol) VALUES(13,'myValue')
GO
DELETE FROM YourTable WHERE ID=3
GO
SET IDENTITY_INSERT YourTable OFF
UPDATE YourTable SET IdentityCol = 13
).SET IDENTITY_INSERT YourTable ON
n'autorise que les INSERTs, pas les UPDATE.Si votre question est correcte, vous voulez faire quelque chose comme
update table set identity_column_name = some value
Permettez-moi de vous dire que ce n'est pas un processus facile et qu'il n'est pas conseillé de l'utiliser, car il peut y avoir des
foreign key
associés.Mais voici les étapes pour le faire, veuillez prendre un
back-up
tableauÉtape 1 - Sélectionnez la vue de conception de la table
Étape 2 - Désactivez la colonne d'identité
Vous pouvez maintenant utiliser la
update
requête.Maintenant,
redo
passez à l'étape 1 et à l'étape 2 et activez la colonne d'identitéRéférence
la source
:)
Tu dois
set identity_insert YourTable ON
Supprimez ensuite votre ligne et réinsérez-la avec une identité différente.
Une fois que vous avez terminé l'insertion, n'oubliez pas de désactiver identity_insert
set identity_insert YourTable OFF
la source
--before running this make sure Foreign key constraints have been removed that reference the ID. --set table to allow identity to be inserted SET IDENTITY_INSERT yourTable ON; GO --insert everything into a temp table SELECT * INTO #tmpYourTable FROM yourTable --clear your table DELETE FROM yourTable --insert back all the values with the updated ID column INSERT INTO yourTable (IDCol, OtherCols) SELECT ID+1 as updatedID --put any other update logic to the ID here , OtherCols FROM #tmpYourTable --drop the temp table DROP TABLE #tmpYourTable --put identity back to normal SET IDENTITY_INSERT yourTable OFF; GO
la source
Essayez d'utiliser
DBCC CHECKIDENT
:la source
copiez votre table dans une nouvelle table sans colonne d'identité.
select columns into newtable from yourtable
ajouter une colonne d'identité à newtable avec une nouvelle graine et en faire une clé primaire
ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY
la source
SET IDENTITY_INSERT dbo.TableName ON INSERT INTO dbo.TableName ( TableId, ColumnName1, ColumnName2, ColumnName3 ) VALUES ( TableId_Value, ColumnName1_Value, ColumnName2_Value, ColumnName3_Value ) SET IDENTITY_INSERT dbo.TableName OFF
Lorsque vous utilisez Identity_Insert, n'oubliez pas d'inclure les noms de colonne car sql ne vous permettra pas d'insérer sans les spécifier
la source
table_name = donne la table dont vous souhaitez réinitialiser la valeur
valeur = valeur initiale égale à zéro, pour commencer la colonne d'identité avec 1
la source
Vous pouvez également utiliser
SET IDENTITY INSERT
pour vous permettre d'insérer des valeurs dans une colonne d'identité.Exemple:
SET IDENTITY_INSERT dbo.Tool ON GO
Et puis vous pouvez insérer dans une colonne d'identité les valeurs dont vous avez besoin.
la source
ALTER TABLE tablename add newcolumn int update tablename set newcolumn=existingcolumnname ALTER TABLE tablename DROP COLUMN existingcolumnname; EXEC sp_RENAME 'tablename.oldcolumn' , 'newcolumnname', 'COLUMN' update tablename set newcolumnname=value where condition
Cependant, le code ci-dessus ne fonctionne que s'il n'y a pas de relation clé primaire-étrangère
la source
Solution complète pour les programmeurs C # utilisant le générateur de commandes
Tout d'abord, vous devez connaître ces faits:
Donc, une fois que vous savez cela, ce que vous devez faire est. Programmez votre propre instruction SQL Insert ou programmez votre propre générateur de commandes d'insertion. Ou utilisez celui que je suis programmé pour vous. Étant donné un DataTable, génère le script SQL Insert:
public static string BuildInsertSQLText ( DataTable table ) { StringBuilder sql = new StringBuilder(1000,5000000); StringBuilder values = new StringBuilder ( "VALUES (" ); bool bFirst = true; bool bIdentity = false; string identityType = null; foreach(DataRow myRow in table.Rows) { sql.Append( "\r\nINSERT INTO " + table.TableName + " (" ); foreach ( DataColumn column in table.Columns ) { if ( column.AutoIncrement ) { bIdentity = true; switch ( column.DataType.Name ) { case "Int16": identityType = "smallint"; break; case "SByte": identityType = "tinyint"; break; case "Int64": identityType = "bigint"; break; case "Decimal": identityType = "decimal"; break; default: identityType = "int"; break; } } else { if ( bFirst ) bFirst = false; else { sql.Append ( ", " ); values.Append ( ", " ); } sql.Append ("["); sql.Append ( column.ColumnName ); sql.Append ("]"); //values.Append (myRow[column.ColumnName].ToString() ); if (myRow[column.ColumnName].ToString() == "True") values.Append("1"); else if (myRow[column.ColumnName].ToString() == "False") values.Append("0"); else if(myRow[column.ColumnName] == System.DBNull.Value) values.Append ("NULL"); else if(column.DataType.ToString().Equals("System.String")) { values.Append("'"+myRow[column.ColumnName].ToString()+"'"); } else values.Append (myRow[column.ColumnName].ToString()); //values.Append (column.DataType.ToString() ); } } sql.Append ( ") " ); sql.Append ( values.ToString () ); sql.Append ( ")" ); if ( bIdentity ) { sql.Append ( "; SELECT CAST(scope_identity() AS " ); sql.Append ( identityType ); sql.Append ( ")" ); } bFirst = true; sql.Append(";"); values = new StringBuilder ( "VALUES (" ); } //fin foreach return sql.ToString (); }
la source
J'ai résolu ce problème en utilisant d'abord DBCC, puis en utilisant insert. Par exemple si votre table est
Commencez par définir la nouvelle valeur d'ID actuelle sur la table comme NEW_RESEED_VALUE
MyTable {IDCol, colA, colB}
alors vous pouvez utiliser
insert into MyTable (colA, ColB) select colA, colB from MyTable
Cela dupliquerait tous vos enregistrements, mais en utilisant une nouvelle valeur IDCol commençant par NEW_RESEED_VALUE. Vous pouvez ensuite supprimer les lignes en double de valeur d'ID supérieure une fois que vous avez supprimé / déplacé leurs références de clé étrangère, le cas échéant.
la source
Vous pouvez créer une nouvelle table à l'aide du code suivant.
SELECT IDENTITY (int, 1, 1) AS id, column1, column2 INTO dbo.NewTable FROM dbo.OldTable
Supprimez ensuite l'ancienne base de données et renommez la nouvelle base de données avec le nom de l'ancienne base de données. Remarque : cette colonne1 et colonne2 représentent toutes les colonnes de votre ancienne table que vous souhaitez conserver dans votre nouvelle table.
la source
Si vous avez spécifiquement besoin de changer la valeur de la clé primaire en un nombre différent (ex 123 -> 1123). La propriété d'identité bloque la modification d'une valeur PK. Définir Identity_insert ne fonctionnera pas. Il n'est pas conseillé d'effectuer une insertion / suppression si vous avez des suppressions en cascade (sauf si vous désactivez la vérification de l'intégrité référentielle).
Ce script désactivera l'identité sur un PK:
*********************** sp_configure 'allow update', 1 go reconfigure with override go update syscolumns set colstat = 0 --turn off bit 1 which indicates identity column where id = object_id('table_name') and name = 'column_name' go exec sp_configure 'allow update', 0 go reconfigure with override go ***********************
Ensuite, vous pouvez définir les relations afin qu'elles mettent à jour les références de clé étrangère. Sinon, vous devez désactiver l'application des relations. Ce lien SO montre comment: Comment les contraintes de clé étrangère peuvent-elles être temporairement désactivées à l'aide de T-SQL?
Maintenant, vous pouvez faire vos mises à jour. J'ai écrit un court script pour écrire tout mon SQL de mise à jour basé sur le même nom de colonne (dans mon cas, j'avais besoin d'augmenter le CaseID de 1000000:
select 'update ['+c.table_name+'] SET ['+Column_Name+']=['+Column_Name+']+1000000' from Information_Schema.Columns as c JOIN Information_Schema.Tables as t ON t.table_Name=c.table_name and t.Table_Schema=c.table_schema and t.table_type='BASE TABLE' where Column_Name like 'CaseID' order by Ordinal_position
Enfin, réactivez l'intégrité référentielle, puis réactivez la colonne Identité sur la clé primaire.
Remarque: je vois des gens sur ces questions demander POURQUOI. Dans mon cas, je dois fusionner les données d'une deuxième instance de production dans une base de données maître afin de pouvoir arrêter la deuxième instance. J'ai juste besoin de toutes les données PK / FK des opérations pour ne pas entrer en collision. Les FK de méta-données sont identiques.
la source