Zresetuj wartość TOŻSAMOŚCI

16

Mam tabelę z kolumną TOŻSAMOŚĆ. Podczas programowania od czasu do czasu usuwam wiersze i dodam je ponownie. Ale wartości TOŻSAMOŚCI zawsze rosły i nie zaczynały się od 1, gdy je ponownie dodałem. Teraz mój identyfikator ma wartość 68 -> 92, co powoduje awarię mojego kodu.

Jak zresetować wartość TOŻSAMOŚCI?

Gijs
źródło
Uczyniłbym mój kod bardziej odpornym na brakujące wartości tożsamości. Kolumna tożsamości nie gwarantuje ciągłą numerację, i będzie w końcu zdarzyć
Trubs

Odpowiedzi:

29

Możesz zresetować wartość tożsamości za pomocą

DBCC CHECKIDENT('tableName', RESEED, 0)

Więc następnym razem, gdy wstawisz do TableName, wstawiona wartość tożsamości będzie wynosić 1.

Podczas usuwania wierszy z tabeli, nie będzie wyzerować wartość tożsamości, ale to ciągle wzrasta go. Tak jak w twoim przypadku.

Teraz, kiedy obetniesz tabelę, zresetuje ona wartość Tożsamości do oryginalnej wartości początkowej tabeli.

Szczegółowy przykład i kilka dobrych wyjaśnień różnicy między obcięciem a usunięciem : SQL SERVER - DELETE, TRUNCATE and RESEED Identity.

Kin Shah
źródło
22

Kin pokazał ci, jak możesz zresetować wartość TOŻSAMOŚCI, ale poza środowiskiem programistycznym, kiedy naprawdę usuwasz wszystkie dane, dlaczego musisz to zrobić?

Mam nadzieję, że nie zamierzasz utrzymywać ciągłej sekwencji wartości TOŻSAMOŚCI podczas produkcji. I mam nadzieję, że tak naprawdę nie piszesz swojego kodu, aby zakodować na stałe wartości TOŻSAMOŚCI. Jeśli są to znaczące wartości identyfikatora, należy przestać używać właściwości TOŻSAMOŚĆ.

Jest kilka rzeczy, które temu zapobiegną:

  • jeśli podczas transakcji zostanie przypisana wartość TOŻSAMOŚCI, a transakcja zostanie wycofana, wartość ta nie zostanie „zwrócona”, a następną wartością będzie nigdy nie używana + 1.
  • jeśli wiersz zostanie później usunięty, TOŻSAMOŚĆ nigdy nie wróci, aby wypełnić luki.
  • w programie SQL Server 2012 występuje aktywny błąd, który nie zostanie naprawiony, dopóki SQL Server 2014 nigdy nie zostanie naprawiony (chyba że użyjesz nieudokumentowanej i bardzo drogiej flagi śledzenia), w wyniku czego ponowne uruchomienie wydaje się odrzucać do 1000 wartości z kolumny TOŻSAMOŚĆ . Błąd w Connect sugeruje, że jest to ograniczone do zdarzeń przełączania awaryjnego z udziałem grup dostępności, ale zapewniam, że błąd jest znacznie szerszy.

Krótko mówiąc, jeśli zależy Ci na lukach lub chcesz nadać tym wartościom konkretne znaczenie, przestań używać TOŻSAMOŚCI. Upuść i ponownie utwórz tabelę, a gdy musisz usunąć wartości i ponownie wypełnić, albo wykonaj aktualizację, albo wstaw wstawkę z zakodowanymi wartościami dla tej kolumny.

Nawiasem mówiąc, klucz podstawowy i tożsamość to nie to samo. Kolumna tożsamości nie jest kluczem podstawowym, chyba że wyraźnie ją zdefiniujesz, a na pewno możesz mieć klucz podstawowy, który nie jest kolumną tożsamości.

Aaron Bertrand
źródło
-4

Jeśli musisz tylko wyeliminować ostatnie wiersze, które nie były zgodne z przyrostową wartością pola tożsamości, istnieje prosty i bezpieczny sposób:

  1. najpierw usuń ostatnie rekordy, które „skoczyły”
  2. zmień typ danych swojego pola tożsamości (z int na bigint lub odwrotnie)
  3. zapisz stół
  4. dodaj nowy rekord i sprawdź, czy przypisuje on numer najwyższej wartości + 1
  5. Zastąp typ danych swojego pola tożsamości, co jest wygodne dla twoich potrzeb

i gotowe.

Ramon Baiges Miro
źródło
3
„Zapisz tabelę” nie jest znaczącym stwierdzeniem dla SQL Server. Zmiana typów danych może być trywialna z mniej niż 100 wierszami, ale może okazać się bardzo droga w przypadku dużych tabel.
Michael Green
2
Zakładam, że masz na myśli SSMS. Spowoduje to utworzenie nowej tabeli, skopiowanie do niej wszystkich wierszy, upuszczenie starej tabeli i zmianę nazwy nowej. Musisz to zrobić dwa razy, aby przełączyć typ danych z powrotem. Łamie orzechy za pomocą młota.
Martin Smith