it-swarm.com.de

Wie aktualisiere ich die Identitätsspalte in SQL Server?

Ich habe eine SQL Server-Datenbank, und ich möchte die Identitätsspalte ändern, da sie mit einer großen Zahl 10010 begonnen hat. 

Wie kann ich diese Spalte am besten ändern oder zurücksetzen?

141

In SQL Server kann der Wert der Identitätsspalte im Gegensatz zu .__ nicht aktualisiert werden. Was können Sie mit normalen Spalten tun? Es ist daher nicht möglich, die Identitätsspalte zu aktualisieren.

Es gibt zwar einige Alternativen, um ähnliche Anforderungen zu erfüllen. Einer von ihnen ist:

USE DBCC CHECKIDENT

DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)

Wenn Sie den Wert der Identitätsspalte vorhandener Datensätze aktualisieren möchten, müssen Sie festlegen

set identity_insert YourTable ON

Beispiel

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

Wenn Ihre Frage richtig ist, möchten Sie etwas tun 

update table
set identity_column_name = some value

Ich sage Ihnen, es ist kein einfacher Prozess und es ist nicht ratsam, ihn zu verwenden, da möglicherweise foreign key damit verbunden ist. 

Aber hier sind Schritte, um dies zu tun. Bitte nehmen Sie eine back-up-Tabelle

Schritt 1- Wählen Sie die Entwurfsansicht der Tabelle aus

enter image description here

Schritt 2: Deaktivieren Sie die Identitätsspalte

enter image description here

Jetzt können Sie die update-Abfrage verwenden.

Nun redo die Schritte 1 und 2 und die Identitätsspalte einschalten

Referenz

49
Luv

Du musst

set identity_insert YourTable ON

Löschen Sie dann Ihre Zeile und fügen Sie sie mit einer anderen Identität ein.

Wenn Sie die Einfügung abgeschlossen haben, vergessen Sie nicht, identity_insert auszuschalten

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

Versuchen Sie es mit DBCC CHECKIDENT :

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

kopieren Sie Ihre Tabelle in eine neue Tabelle ohne Identitätsspalte.

    select columns into newtable from yourtable

fügen Sie mit new seed eine Identitätsspalte mit new seed hinzu und machen Sie sie als Primärschlüssel

    ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY
4
user4002899

Sie können auch SET IDENTITY INSERT verwenden, um Werte in eine Identitätsspalte einzufügen.

Beispiel:

SET IDENTITY_INSERT dbo.Tool ON
GO

Und dann können Sie die gewünschten Werte in eine Identitätsspalte einfügen.

2
DaveShaw
DBCC CHECKIDENT(table_name, RESEED, value)

tabellenname = Geben Sie die Tabelle an, deren Wert Sie zurücksetzen möchten 

value = Anfangswert ist Null, um die Identitätsspalte mit 1 zu beginnen

2
Yasmeen Ansari

(Komplettlösung für c # -Programmierer unter Verwendung des Befehls-Generators)

Zunächst müssen Sie diese Fakten kennen: -Auf jeden Fall können Sie keine Identitätsspalte ändern. Sie müssen also die Zeile löschen und mit der neuen Kennung ..__ erneut hinzufügen. -Die Identitätseigenschaft kann nicht aus der Spalte entfernt werden (Sie müssten in die Spalte entfernt werden) -Der benutzerdefinierte Befehls-Generator von .net überspringt immer die Identitätsspalte, sodass Sie sie nicht für diesen Zweck verwenden können.

Sobald Sie das wissen, müssen Sie also Folgendes tun. Programmieren Sie entweder Ihre eigene SQL-Einfügeanweisung oder ein Programm, das Sie zum Einfügen von Befehlserstellern verwenden. Oder verwenden Sie diesen, den ich für Sie programmiert habe. Generiert das gegebene DatatTable das SQL Insert-Skript:

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

Vergessen Sie bei Verwendung von Identity_Insert nicht, die Spaltennamen anzugeben, da SQL das Einfügen ohne Angabe dieser Spalten nicht zulässt

0
user1407955

Ich habe dieses Problem zuerst mit DBCC und dann mit Insert gelöst. Zum Beispiel, wenn Ihre Tabelle ist 

Legen Sie zunächst den neuen aktuellen ID-Wert in der Tabelle als NEW_RESEED_VALUE fest 

Mein Tisch { IDCol, Cola, colB }

    DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE)

dann kannst du verwenden 

    insert into MyTable (colA, ColB) select colA, colB from MyTable

Dies würde alle Ihre Datensätze duplizieren, jedoch den neuen IDCol-Wert verwenden, der mit NEW_RESEED_VALUE beginnt. Sie können dann doppelte Zeilen mit höherem ID-Wert entfernen, sobald Sie ihre Fremdschlüsselreferenzen entfernt oder verschoben haben.

0
Softec

Sie können eine neue Tabelle mit dem folgenden Code erstellen.

SELECT IDENTITY (int, 1, 1) AS id, column1, column2
INTO dbo.NewTable
FROM dbo.OldTable

Löschen Sie dann die alte Datenbank und benennen Sie die neue Datenbank in den Namen der alten Datenbank um. Hinweis : Diese Spalte1 und Spalte2 stehen für alle Spalten in Ihrer alten Tabelle, die Sie in Ihrer neuen Tabelle behalten möchten. 

0
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

Der obige Code funktioniert jedoch nur, wenn keine Primär-Fremdschlüssel-Beziehung besteht

0
Jekin Kalariya