web-dev-qa-db-fra.com

Comment mettre à jour la colonne d'identité dans SQL Server?

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?

141

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
206
Sachin

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

enter image description here

Étape 2- Désactiver la colonne d'identité

enter image description here

Vous pouvez maintenant utiliser la requête update.

Maintenant redo les étapes 1 et 2 et activer la colonne identité

Référence

49
Luv

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
42
R S P
--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
10
kuklei

Essayez d’utiliser DBCC CHECKIDENT :

DBCC CHECKIDENT ('YourTable', RESEED, 1);
5
Darren

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
4
user4002899

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.

2
DaveShaw
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

2
Yasmeen Ansari

(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 (); ;
        }
1
Juan_Mallorca
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.

0
user1407955

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.

0
Softec

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. 

0
Sean H. Worthington
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

0
Jekin Kalariya