Ich habe Datensätze in eine SQL Server-Datenbanktabelle eingefügt. In der Tabelle wurde ein Primärschlüssel definiert, und der Startwert für die automatische Inkrementierung der Identität wird auf "Ja" gesetzt. Dies erfolgt hauptsächlich, weil in SQL Azure für jede Tabelle ein Primärschlüssel und eine Identität definiert sein müssen.
Da ich jedoch einige Datensätze aus der Tabelle löschen muss, wird der Identitätsstartwert für diese Tabellen gestört und die Indexspalte (die automatisch mit einem Inkrement von 1 generiert wird) wird gestört.
Wie kann ich die Identitätsspalte zurücksetzen, nachdem ich die Datensätze gelöscht habe, sodass die Reihenfolge der Spalte in aufsteigender numerischer Reihenfolge erfolgt?
Die Identitätsspalte wird an keiner Stelle in der Datenbank als Fremdschlüssel verwendet.
Antworten:
Der
DBCC CHECKIDENT
Verwaltungsbefehl wird verwendet, um den Identitätszähler zurückzusetzen. Die Befehlssyntax lautet:Beispiel:
Es wurde in früheren Versionen der Azure SQL-Datenbank nicht unterstützt, wird aber jetzt unterstützt.
Beachten Sie, dass das
new_reseed_value
Argument je nach Dokumentation in den SQL Server-Versionen unterschiedlich ist :Aber ich diese Informationen irreführend finden (einfach falsch tatsächlich) , weil beobachtet Verhalten zeigt an, dass mindestens SQL Server 2012 ist nach wie vor verwendet new_reseed_value + die aktuelle Inkrementwert Logik. Microsoft widerspricht sogar seiner eigenen
Example C
auf derselben Seite:Dies alles lässt jedoch eine Option für unterschiedliches Verhalten bei neueren SQL Server-Versionen. Ich denke, der einzige Weg, um sicher zu sein, bis Microsoft die Dinge in seiner eigenen Dokumentation klärt, besteht darin, vor der Verwendung tatsächliche Tests durchzuführen.
quelle
DBCC CHECKIDENT
dies ab der kommenden Version (V12 / Sterling) unterstützt wird: azure.microsoft.com/en-us/documentation/articles/… Für diese spezielle Situation würde ich TRUNCATE TABLE dennoch empfehlen :)Wobei 0 der
identity
Startwert istquelle
TRUNCATE
, sollte der neue Startwert der Wert sein, der bei der nächsten Verwendung verwendet werden soll (dh 1 nicht 0). Wenn die Tabelle nicht leer ist, wird die verwendetnew_reseed_value + 1
. MSDNDELETE
nicht leerTRUNCATE
istnew_reseed+value + 1
. In diesem Fall ist dies auch der Fall . Ich habe einen Beitrag darüber geschrieben, in dem das tatsächliche Verhalten anhand einiger Tests gezeigt und das aktuelle Dokument aktualisiert wurde (jetzt, da es auf GitHub verfügbar ist ): Wie funktioniert der DBCC-CHECKIDENT beim Zurücksetzen des Identitäts-Seeds (RESEED) wirklich? .Es sollte beachtet werden, dass, wenn alle Daten über die
DELETE
(dh keineWHERE
Klausel) aus der Tabelle entfernt werden , solange a) Berechtigungen dies zulassen und b) keine FKs vorhanden sind, die auf die Tabelle verweisen (was zu sein scheint) der Fall hier)TRUNCATE TABLE
wäre die Verwendung bevorzugt, da dies effizienter istDELETE
und gleichzeitig denIDENTITY
Samen zurücksetzt . Die folgenden Details stammen von der MSDN-Seite für TRUNCATE TABLE :Also folgendes:
Wird einfach:
TRUNCATE TABLE
Weitere Informationen zu Einschränkungen usw. finden Sie in der Dokumentation (oben verlinkt).quelle
Obwohl die meisten Antworten RESEED auf 0 vorschlagen, müssen wir oft nur auf die nächste verfügbare ID zurücksetzen
Dadurch wird die Tabelle überprüft und auf die nächste ID zurückgesetzt.
quelle
declare @max int select @max=ISNULL(max([Id]),0) from [TestTable]; DBCC CHECKIDENT ('[TestTable]', RESEED, @max );
Ich habe versucht zu
@anil shahs
antworten und es hat die Identität zurückgesetzt. Aber als eine neue Zeile eingefügt wurde, bekam sie dieidentity = 2
. Also habe ich stattdessen die Syntax geändert in:Dann erhält die erste Zeile die Identität = 1.
quelle
Obwohl die meisten Antworten sind darauf hindeutet ,
RESEED
zu0
, und während einige dies als Fehler für sieheTRUNCATED
Tabellen, hat Microsoft eine Lösung, umfasst nicht dieID
Dadurch wird die Tabelle überprüft und zum nächsten zurückgesetzt
ID
. Dies ist seit MS SQL 2005 bis heute verfügbar.https://msdn.microsoft.com/en-us/library/ms176057.aspx
quelle
Checking identity information: current identity value '[incorrect seed]', current column value '[correct seed]'.
, aber bei neuen Einfügungen wird immer noch der falsche Startwert verwendet.Das Ausgeben von 2 Befehlen kann den Trick machen
Der erste setzt die Identität auf Null zurück und der nächste setzt sie auf den nächsten verfügbaren Wert - jacob
quelle
@Jacob
Bei mir musste ich nur alle Einträge aus der Tabelle löschen und nach dem Löschen die obigen Einträge an einem Triggerpunkt hinzufügen. Jetzt, wenn ich einen Eintrag lösche, wird von dort genommen.
quelle
Truncate
Tabelle wird bevorzugt, da sie die Datensätze löscht, den Zähler zurücksetzt und den Speicherplatz zurückfordert.Delete
undCheckIdent
sollte nur verwendet werden, wenn Fremdschlüssel das Abschneiden verhindern.quelle
Identitätsspalte mit neuer ID zurücksetzen ...
quelle
Dies ist eine häufige Frage und die Antwort ist immer dieselbe: Tu es nicht. Identitätswerte sollten als willkürlich behandelt werden und als solche gibt es keine "richtige" Reihenfolge.
quelle
Führen Sie dieses Skript aus, um die Identitätsspalte zurückzusetzen. Sie müssen zwei Änderungen vornehmen. Ersetzen Sie tableXYZ durch die Tabelle, die Sie aktualisieren möchten. Außerdem muss der Name der Identitätsspalte aus der temporären Tabelle entfernt werden. Dies war in einer Tabelle mit 35.000 Zeilen und 3 Spalten sofort der Fall. Sichern Sie die Tabelle und versuchen Sie dies zunächst in einer Testumgebung.
quelle
Dadurch wird der aktuelle Identitätswert auf 0 gesetzt.
Beim Einfügen des nächsten Werts wird der Identitätswert auf 1 erhöht.
quelle
Verwenden Sie diese gespeicherte Prozedur:
Ich überlege nur meine Antwort. Ich bin auf ein seltsames Verhalten in SQL Server 2008 R2 gestoßen, das Sie beachten sollten.
Die erste Auswahl erzeugt
0, Item 1
.Der zweite produziert
1, Item 1
. Wenn Sie den Reset direkt nach dem Erstellen der Tabelle ausführen, ist der nächste Wert 0. Ehrlich gesagt bin ich nicht überrascht, dass Microsoft dieses Zeug nicht richtig machen kann. Ich habe es entdeckt, weil ich eine Skriptdatei habe, die Referenztabellen auffüllt, die ich manchmal ausführe, nachdem ich Tabellen neu erstellt habe, und manchmal, wenn die Tabellen bereits erstellt wurden.quelle
Ich benutze dazu das folgende Skript. Es gibt nur ein Szenario, in dem ein "Fehler" auftritt, wenn Sie alle Zeilen aus der Tabelle gelöscht haben und
IDENT_CURRENT
derzeit auf 1 gesetzt sind, dh es gab zunächst nur eine Zeile in der Tabelle.quelle
Für eine vollständige DELETE-Zeile und das Zurücksetzen der IDENTITY-Anzahl verwende ich diese (SQL Server 2008 R2)
quelle
Das erneute Säen auf 0 ist nur dann sehr praktisch, wenn Sie den gesamten Tisch aufräumen.
ansonsten ist die Antwort von Anthony Raymond perfekt. Holen Sie sich zuerst das Maximum der Identitätsspalte und setzen Sie es dann mit max.
quelle
Ich habe versucht, dies für eine große Anzahl von Tabellen während der Entwicklung zu erledigen, und dies funktioniert als Zauber.
Sie erzwingen also zuerst, dass es auf 1 gesetzt wird, und setzen es dann auf den höchsten Index der in der Tabelle vorhandenen Zeilen. Schneller und einfacher Rest der Idee.
quelle
Es ist immer besser, TRUNCATE zu verwenden, wenn dies möglich ist, als alle Datensätze zu löschen, da kein Protokollspeicherplatz verwendet wird.
Wenn wir den Startwert löschen und zurücksetzen müssen, denken Sie immer daran, dass, wenn die Tabelle nie gefüllt wurde und Sie sie verwendet haben, der
DBCC CHECKIDENT('tablenem',RESEED,0)
erste Datensatz die Identität = 0 erhält, wie in der msdn-Dokumentation angegebenquelle
TRUNCATE
dies verhindern würde, dass SieROLLBACK
sich wie erwartet verhalten? ROLLBACK rollt immer noch zurück. Auch wenn die DB auf eingestellt istBULK_LOGGED
.Erstens: Identitätsspezifikation Nur: "Nein" >> Datenbank speichern Projekt ausführen
Danach: Identitätsspezifikation Nur: "JA" >> Database Execute Project speichern
Ihre Datenbank-ID, PK Beginnen Sie mit 1 >>
quelle