Sie können die Identitätsspalte nicht aktualisieren.
In SQL Server kann die Identitätsspalte nicht aktualisiert werden, anders als bei anderen Spalten mit einer Update-Anweisung.
Es gibt zwar einige Alternativen, um eine ähnliche Anforderung zu erfüllen.
- Wenn der Wert der Identitätsspalte für neue Datensätze aktualisiert werden muss
Verwenden Sie DBCC CHECKIDENT, das den aktuellen Identitätswert für die Tabelle überprüft und bei Bedarf den Identitätswert ändert.
DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)
- Wenn der Wert der Identitätsspalte für vorhandene Datensätze aktualisiert werden muss
Verwenden Sie IDENTITY_INSERT , mit dem explizite Werte in die Identitätsspalte einer Tabelle eingefügt werden können.
SET IDENTITY_INSERT YourTable {ON|OFF}
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 the 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 the previous track
SET IDENTITY_INSERT YourTable OFF
UPDATE YourTable SET IdentityCol = 13
. B. ).SET IDENTITY_INSERT YourTable ON
erlaubt nur INSERTs, keine UPDATEs.Wenn Sie Ihre Frage richtig gestellt haben, möchten Sie so etwas tun
Lassen Sie mich Ihnen sagen, es ist kein einfacher Prozess und es ist nicht ratsam, ihn zu verwenden, da möglicherweise einige damit
foreign key
verbunden sind.Aber hier sind Schritte, um es zu tun. Bitte nehmen Sie einen
back-up
TischSchritt 1- Wählen Sie die Entwurfsansicht der Tabelle aus
Schritt 2- Deaktivieren Sie die Identitätsspalte
Jetzt können Sie die
update
Abfrage verwenden.Nun
redo
die Schritte 1 und 2 und Aktivieren Sie die IdentitätsspalteReferenz
quelle
:)
Du brauchst
Löschen Sie dann Ihre Zeile und fügen Sie sie mit einer anderen Identität wieder ein.
Vergessen Sie nach dem Einfügen nicht, identity_insert zu deaktivieren
quelle
quelle
Versuchen Sie es mit
DBCC CHECKIDENT
:quelle
Kopieren Sie Ihre Tabelle in eine neue Tabelle ohne Identitätsspalte.
Fügen Sie der Newtable eine Identitätsspalte mit neuem Startwert hinzu und legen Sie sie als Primärschlüssel fest
quelle
table_name = Geben Sie die Tabelle an, deren Wert Sie zurücksetzen möchten
value = Anfangswert ist Null, um die Identitätsspalte mit 1 zu beginnen
quelle
Vergessen Sie bei der Verwendung von Identity_Insert nicht, die Spaltennamen anzugeben, da Sie mit SQL nicht einfügen können, ohne sie anzugeben
quelle
Sie können auch verwenden
SET IDENTITY INSERT
, um Werte in eine Identitätsspalte einzufügen.Beispiel:
Anschließend können Sie die benötigten Werte in eine Identitätsspalte einfügen.
quelle
Der obige Code funktioniert jedoch nur, wenn keine Primär-Fremdschlüssel-Beziehung besteht
quelle
Komplettlösung für C # -Programmierer mit Command Builder
Zuallererst müssen Sie diese Fakten kennen:
Wenn Sie das wissen, müssen Sie es tun. Programmieren Sie entweder Ihre eigene SQL Insert-Anweisung oder Ihren eigenen Insert Command Builder. Oder verwenden Sie diese, die ich für Sie programmiert habe. Generiert bei einer gegebenen DataTable das SQL Insert-Skript:
quelle
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
MyTable {IDCol, colA, colB}
dann kannst du verwenden
Dies würde alle Ihre Datensätze duplizieren, aber einen neuen IDCol-Wert verwenden, der mit NEW_RESEED_VALUE beginnt. Sie können dann doppelte Zeilen mit höherem ID-Wert entfernen, sobald Sie deren Fremdschlüsselreferenzen entfernt / verschoben haben, falls vorhanden.
quelle
Mit dem folgenden Code können Sie eine neue Tabelle erstellen.
Löschen Sie dann die alte Datenbank und benennen Sie die neue Datenbank in den Namen der alten Datenbank um. Hinweis : Spalte1 und Spalte2 stellen alle Spalten in Ihrer alten Tabelle dar, die Sie in Ihrer neuen Tabelle behalten möchten.
quelle
Wenn Sie den Primärschlüsselwert speziell in eine andere Zahl ändern müssen (z. B. 123 -> 1123). Die Identitätseigenschaft blockiert das Ändern eines PK-Werts. Set Identity_insert wird nicht funktionieren. Das Einfügen / Löschen ist nicht ratsam, wenn Sie kaskadierende Löschvorgänge haben (es sei denn, Sie deaktivieren die Überprüfung der referenziellen Integrität).
Dieses Skript deaktiviert die Identität einer PK:
Als Nächstes können Sie die Beziehungen so einstellen, dass sie die Fremdschlüsselreferenzen aktualisieren. Oder Sie müssen die Durchsetzung von Beziehungen deaktivieren. Dieser SO-Link zeigt, wie: Wie können Fremdschlüsseleinschränkungen mithilfe von T-SQL vorübergehend deaktiviert werden?
Jetzt können Sie Ihre Updates durchführen. Ich habe ein kurzes Skript geschrieben, um alle meine Update-SQLs mit demselben Spaltennamen zu schreiben (in meinem Fall musste ich die CaseID um 1.000.000 erhöhen:
Zuletzt aktivieren Sie die referenzielle Integrität erneut und aktivieren Sie dann die Spalte Identität auf dem Primärschlüssel erneut.
Hinweis: Ich sehe einige Leute bei diesen Fragen fragen, warum. In meinem Fall muss ich Daten von einer zweiten Produktionsinstanz in eine Master-Datenbank zusammenführen, damit ich die zweite Instanz herunterfahren kann. Ich brauche nur alle PK / FKs der Betriebsdaten, um nicht zu kollidieren. Metadaten-FKs sind identisch.
quelle