IDENTITY-Wert zurücksetzen

16

Ich habe eine Tabelle mit einer IDENTITY-Spalte. Während der Entwicklung lösche ich die Zeilen von Zeit zu Zeit und füge sie erneut hinzu. Aber die IDENTITY-Werte stiegen immer weiter an und begannen nicht bei 1, als ich sie erneut hinzufügte. Jetzt geht meine ID von 68 -> 92 und dies bringt meinen Code zum Absturz.

Wie setze ich den IDENTITY-Wert zurück?

Gijs
quelle
Ich würde meinen Code widerstandsfähiger gegen fehlende Identitätswerte machen. Eine Identitätsspalte garantiert keine
fortlaufende

Antworten:

29

Sie können den Identitätswert mit zurücksetzen

DBCC CHECKIDENT('tableName', RESEED, 0)

Wenn Sie also das nächste Mal in TableName einfügen, wird der Identitätswert 1 sein.

Wenn Sie Zeilen aus der Tabelle löschen , wird der Identitätswert nicht zurückgesetzt, sondern ständig erhöht. Genau wie in deinem Fall.

Wenn Sie die Tabelle jetzt abschneiden , wird der Identitätswert auf den ursprünglichen Seed-Wert der Tabelle zurückgesetzt.

Unter SQL-SERVER - LÖSCHEN, TRUNCIEREN und RESEED-Identität finden Sie ein detailliertes Beispiel und eine gute Erläuterung des Unterschieds zwischen Abschneiden und Löschen

Kin Shah
quelle
22

Kin hat Ihnen gezeigt, wie Sie den IDENTITY-Wert zurücksetzen können. Warum müssen Sie das tun, wenn Sie wirklich alle Daten von einer Entwicklungsumgebung entfernen ?

Ich hoffe, dass Sie nicht beabsichtigen, eine zusammenhängende Folge von IDENTITY-Werten beizubehalten, wenn Sie in der Produktion sind. Und ich hoffe, Sie schreiben nicht wirklich Ihren Code, um die IDENTITY-Werte fest zu codieren. Wenn dies aussagekräftige ID-Werte sind, sollten Sie die Verwendung der IDENTITY-Eigenschaft beenden.

Es gibt einige Dinge, die dies verhindern:

  • Wenn während einer Transaktion ein IDENTITY-Wert zugewiesen wird und die Transaktion rückgängig gemacht wird, wird der Wert nicht "zurückgegeben" und der nächste Wert wird der nie verwendete + 1-Wert sein.
  • Wenn eine Zeile später gelöscht wird, wird die IDENTITÄT nie wieder verwendet, um die Lücken zu füllen.
  • In SQL Server 2012 gibt es einen aktiven Fehler, der erst behoben wird, wenn SQL Server 2014 nicht behoben wird (es sei denn, Sie verwenden ein undokumentiertes und sehr teures Ablaufverfolgungsflag). Bei einem Neustart werden anscheinend bis zu 1000 Werte aus Ihrer IDENTITY-Spalte gelöscht . Der Fehler in Connect lässt darauf schließen, dass dies auf Failover-Ereignisse beschränkt ist, an denen Verfügbarkeitsgruppen beteiligt sind.

Kurz gesagt, wenn Sie sich für Lücken interessieren oder diesen Werten eine bestimmte Bedeutung geben möchten, verwenden Sie IDENTITY nicht mehr. Löschen Sie die Tabelle und erstellen Sie sie neu. Wenn Sie die Werte löschen und neu auffüllen müssen, führen Sie entweder eine Aktualisierung oder eine Einfügung mit fest codierten Werten für diese Spalte durch.

Abgesehen davon sind Primärschlüssel und Identität nicht dasselbe. Eine Identitätsspalte ist kein Primärschlüssel, es sei denn, Sie definieren sie ausdrücklich als solche, und Sie können mit Sicherheit einen Primärschlüssel haben, der keine Identitätsspalte ist.

Aaron Bertrand
quelle
-4

Wenn Sie nur die letzten Zeilen entfernen müssen, die nicht dem inkrementellen Wert eines Identitätsfelds gefolgt sind, gibt es eine einfache und sichere Möglichkeit:

  1. Löschen Sie zuerst die letzten Datensätze, die "gesprungen" sind.
  2. Ändern Sie den Datentyp Ihres Identitätsfeldes (von int nach bigint oder umgekehrt)
  3. Speichern Sie die Tabelle
  4. Fügen Sie einen neuen Datensatz hinzu und überprüfen Sie, ob ihm die Nummer mit dem höchsten Wert + 1 zugewiesen ist
  5. Ersetzen Sie den Datentyp Ihres Identitätsfelds entsprechend Ihren Anforderungen

und du bist fertig.

Ramon Baiges Miro
quelle
3
"Speichern Sie die Tabelle" ist keine aussagekräftige Anweisung für SQL Server. Das Ändern von Datentypen kann mit weniger als 100 Zeilen trivial sein, kann sich jedoch für große Tabellen als sehr teuer erweisen .
Michael Green
2
Ich nehme an, Sie meinen in SSMS. Dadurch wird eine neue Tabelle erstellt, alle Zeilen in die Tabelle kopiert, die alte Tabelle gelöscht und die neue umbenannt. Und Sie müssen dies zweimal tun, um den Datentyp zurückzuschalten. Es benutzt einen Vorschlaghammer, um eine Nuss zu knacken.
Martin Smith