J'ai une base de données SQL Server et je souhaite modifier la colonne d'identité car elle a démarré Avec un grand nombre 10010
et qu'elle est liée à une autre table. Maintenant, j'ai 200 enregistrements et je souhaite résoudre ce problème avant que les enregistrements n'augmentent.
Quel est le meilleur moyen de changer ou de réinitialiser cette colonne?
SQL Server ne permet pas de mettre à jour la valeur de la colonne d'identité contrairement à ce que vous pouvez faire avec des colonnes normales. Il n'est donc pas possible de mettre à jour la colonne d'identité.
Bien qu'il existe des alternatives pour remplir le même type d'exigence. L'un d'eux est:
USE DBCC CHECKIDENT
DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)
Si vous souhaitez mettre à jour la valeur de la colonne d’identité des enregistrements existants, vous devez définir
set identity_insert YourTable ON
Exemple
-- Set Identity insert on so that value can be inserted into this column
SET IDENTITY_INSERT YourTable ON
GO
-- Insert the record which you want to update with new value in identity column
INSERT INTO YourTable(IdentityCol, otherCol) VALUES(13,'myValue')
GO
-- Delete the old row of which you have inserted a copy (above) (make sure about FK's)
DELETE FROM YourTable WHERE ID=3
GO
--Now set the idenetity_insert OFF to back to prevoius track
SET IDENTITY_INSERT YourTable OFF
Si vous avez bien compris votre question, vous voulez faire quelque chose comme
update table
set identity_column_name = some value
Laissez-moi vous dire que ce n'est pas un processus facile et qu'il est déconseillé de l'utiliser, car il peut y avoir un foreign key
associé.
Mais voici les étapes pour le faire, veuillez prendre un back-up
du tableau
Étape 1- Sélectionnez la vue de conception de la table
Étape 2- Désactiver la colonne d'identité
Vous pouvez maintenant utiliser la requête update
.
Maintenant redo
les étapes 1 et 2 et activer la colonne identité
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
--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
Essayez d’utiliser DBCC CHECKIDENT
:
DBCC CHECKIDENT ('YourTable', RESEED, 1);
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
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
Vous pouvez ensuite insérer dans une colonne d'identité les valeurs dont vous avez besoin.
DBCC CHECKIDENT(table_name, RESEED, value)
nom_table = donne la table que vous voulez réinitialiser
valeur = la valeur initiale doit être zéro, pour démarrer la colonne d'identité avec 1
(Solution complète pour les programmeurs c # utilisant le constructeur de commandes)
Tout d’abord, vous devez connaître ces faits: Dans tous les cas, vous ne pouvez pas modifier une colonne d'identité, vous devez donc supprimer la ligne et l'ajouter de nouveau avec le nouvel identity ..__ -Vous ne pouvez pas supprimer la propriété d'identité de la colonne (vous devez supprimer la colonne) -Le constructeur de commandes personnalisées de .net ignore toujours la colonne d'identité. Vous ne pouvez donc pas l'utiliser à cette fin.
Donc, une fois que vous savez cela, vous devez faire. Programmez votre propre instruction SQL Insert ou programmez-vous en tant que constructeur de commandes Insert. Ou utilisez celui-ci que je serai programmé pour vous. Étant donné un DatatTable, 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 (); ;
}
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
Lors de l'utilisation d'Identity_Insert, n'oubliez pas d'inclure les noms de colonne, car SQL ne vous permettra pas d'insérer sans les spécifier.
J'ai résolu ce problème en utilisant d'abord DBCC, puis en utilisant insert. Par exemple si votre table est
Définissez d'abord la nouvelle valeur d'ID actuelle sur la table en tant que NEW_RESEED_VALUE
Ma table { IDCol, Cola, colB }
DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE)
alors vous pouvez utiliser
insert into MyTable (colA, ColB) select colA, colB from MyTable
Cela dupliquerait tous vos enregistrements, mais en utilisant la nouvelle valeur IDCol commençant par NEW_RESEED_VALUE. Vous pouvez ensuite supprimer les lignes en double de valeur ID supérieure une fois que vous avez supprimé/déplacé leurs références de clé étrangère, le cas échéant.
Vous pouvez créer une nouvelle table en utilisant le 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 en son nom. Remarque : que column1 et column2 représentent toutes les colonnes de votre ancienne table que vous souhaitez conserver dans votre nouvelle table.
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