Reset Startwert nach dem löschen von Datensätzen in SQL Server
Habe ich eingefügt Datensätze in einer SQL Server-Datenbank-Tabelle. In der Tabelle ein Primärschlüssel definiert ist, und die auto-Inkrement Startwert ist auf "ja" gesetzt. Dies geschieht in Erster Linie, weil in der SQL Azure, jede Tabelle muss einen Primärschlüssel haben und der Identität definiert.
Aber seit dem habe ich auf löschen Sie einige Datensätze aus der Tabelle, die Identität Samen für diese Tabellen wird gestört und die index-Spalte (welche automatisch generiert wird mit einem Inkrement von 1) gestört.
Wie kann ich zurücksetzen der identity-Spalte, nachdem ich Sie gelöscht, die Datensätze so, dass die Spalte Reihenfolge in aufsteigender numerischer Reihenfolge?
Die identity-Spalte nicht verwendet werden, da eine foreign key-überall in der Datenbank.
InformationsquelleAutor der Frage Romil N | 2014-02-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
DBCC CHECKIDENT
management-Befehl wird verwendet, um die reset-Identität Zähler. Der Befehl syntax ist:Beispiel:
War es nicht unterstützt in früheren Versionen von Azure SQL-Datenbank, aber wird jetzt unterstützt.
Bitte beachten Sie, dass
new_reseed_value
argument ist vielfältig über SQL Server-Versionen gemäß der Dokumentation:Jedoch ich finde diese Informationen irreführend (einfach nur falsch), da beobachtete Verhalten zeigt an, dass mindestens der SQL Server 2012 ist immer noch verwendet new_reseed_value + das aktuelle Inkrement-Wert-Logik. Microsoft selbst im Widerspruch mit seiner eigenen
Example C
gefunden auf derselben Seite:Immer noch, dies alles hinterlässt eine option für das unterschiedliche Verhalten auf neuere SQL Server-Versionen. Ich denke, der einzige Weg, um sicher zu sein, bis Microsoft aufzuräumen, die Dinge in seine eigene Dokumentation, zu tun, die die eigentlichen tests vor der Verwendung.
InformationsquelleAutor der Antwort Petr Abdulin
Wobei 0
identity
StartwertInformationsquelleAutor der Antwort anil shah
Es sollte angemerkt werden, dass, WENN alle der Daten aus der Tabelle entfernt über die
DELETE
(d.h. keineWHERE
- Klausel), dann solange a) die Berechtigungen dies zulassen, und b) es gibt keine FKs verweisen auf die Tabelle (das scheint hier der Fall sein), mitTRUNCATE TABLE
bevorzugt würde, da er ein effizienterDELETE
und setzt dieIDENTITY
Samen zur gleichen Zeit. Die folgenden Angaben sind entnommen aus dem MSDN-Seite für TRUNCATE TABLE:Also Folgendes:
Wird nur:
Finden Sie die
TRUNCATE TABLE
Dokumentation (weiter oben verlinkt) weitere Informationen zu den Einschränkungen, etc.InformationsquelleAutor der Antwort Solomon Rutzky
Obwohl die meisten Antworten sind darauf hindeutet, RESEED, 0,, Aber viele Male müssen wir einfach reseed zu next Id verfügbar
Dieser prüft die Tabelle und setzen Sie für die nächste ID.
InformationsquelleAutor der Antwort Atal Kishore
Versuchte ich
@anil shahs
Antwort und zurücksetzen der Identität. Aber wenn eine neue Zeile eingefügt wurde, bekam Sie dieidentity = 2
. Anstatt also, ich habe die syntax:Dann wird die erste Zeile, um die Identität = 1.
InformationsquelleAutor der Antwort Mikael Engver
Obwohl die meisten Antworten suggerieren
RESEED
zu0
und während einige sehen dies als Makel fürTRUNCATED
Tabellen, Microsoft hat eine Lösung, schließt dieID
Dieser prüft die Tabelle und setzen Sie auf die nächste
ID
. Dies wurde möglich, da MS SQL 2005-current".https://msdn.microsoft.com/en-us/library/ms176057.aspx
InformationsquelleAutor der Antwort SollyM
@jacob
Arbeitete für mich, ich musste Sie nur deaktivieren Sie alle Einträge aus der Tabelle, dann die oben in einen Triggerpunkt nach löschen. Jetzt, wenn ich einen Eintrag löschen wird von dort entnommen.
InformationsquelleAutor der Antwort epic
Dies ist eine häufige Frage und die Antwort ist immer die gleiche: tun Sie es nicht. Identität Werte sollten so behandelt werden, als willkürlich und als solche, es gibt keine "richtigen" Reihenfolge.
InformationsquelleAutor der Antwort Ben Thul
Ausstellung 2-Befehl kann den trick tun
dem ersten reset die Identität zu null , und die nächste wird es auf den nächsten verfügbaren Wert
-- Jakob
InformationsquelleAutor der Antwort jacob
Truncate table wird bevorzugt, weil es löscht die Datensätze, setzt den Zähler und nimmt die dis Platz.
Löschen und CheckIdent sollte nur verwendet werden, wo Fremdschlüssel verhindern, dass Sie abgeschnitten
InformationsquelleAutor der Antwort Dyna Dave
Reset-identity-Spalte mit neuen id...
InformationsquelleAutor der Antwort Mukesh Pandey
Führen Sie dieses Skript zum zurücksetzen der identity-Spalte. Sie müssen zwei änderungen. Ersetzen tableXYZ mit was auch immer-Tabelle, die Sie aktualisieren müssen. Auch die Namen der identity-Spalte braucht, fällt aus der temp-Tabelle. Dieser war augenblicklich auf eine Tabelle mit 35.000 Zeilen & 3 Spalten. Natürlich, ein backup der Tabelle und zunächst versuchen, diese in einer Testumgebung.
InformationsquelleAutor der Antwort Matthew Baic
Verwenden Sie diese gespeicherte Prozedur:
Nur der Rückgriff auf meine Antwort. Stieß ich auf ein seltsames Verhalten in sql server 2008 r2, die Sie sich bewusst sein sollten.
Den ersten wählen Sie produziert
0, Item 1
.Die zweite produziert
1, Item 1
. Wenn Sie führen Sie das reset direkt nach dem erstellen der Tabelle der nächste Wert ist 0. Ehrlich gesagt bin ich nicht überrascht, dass Microsoft kann nicht dieses Zeug. Entdeckt habe ich es, weil ich eine Skript-Datei, die füllt Referenz-Tabellen, die ich manchmal laufen, nachdem ich wieder Tabellen erstellen und manchmal, wenn die Tabellen bereits angelegt sind.InformationsquelleAutor der Antwort costa
Damit wird der aktuelle Identitätswert zu 0.
Auf einfügen wird der nächste Wert, der identity-Wert zu bekommen um 1 erhöht.
InformationsquelleAutor der Antwort Bimzee
Für eine komplette Zeilen LÖSCHEN und zurücksetzen der IDENTITÄT zählen, ich benutze dieses (SQL Server 2008 R2)
InformationsquelleAutor der Antwort Fandango68
Seine immer besser ABSCHNEIDENwenn möglich, anstatt Sie zu löschen Sie alle Datensätze, da es keine log-Raum auch.
Fall, müssen wir löschen und zurücksetzen müssen, die Nachkommen, immer daran denken, dass wenn die Tabelle wurde nie aufgefüllt, und Sie verwendet
DBCC CHECKIDENT('tablenem',RESEED,0)
dann den ersten Datensatz bekommen identity = 0
wie bereits auf msdn-Dokumentation
InformationsquelleAutor der Antwort Abdul Hannan Ijaz
Erste : Identität-Spezifikation Nur : "No" >> Datenbank Speichern Ausführen-Projekt
Dann : Identität-Spezifikation Nur : "YES" >> Datenbank Speichern Ausführen-Projekt
Ihre Datenbank-ID, PK-Start von 1 >>
InformationsquelleAutor der Antwort Pratik Patel