Jak ustawić kolumnę IDENTITY tak, by numerować od poczatku?

29-Cze-2011

Gdy tabela posiada kolumnę określona jako IDENTITY, to wartości dla tej kolumny sa generowane automatycznie. Czasami jednak po pewnych operacjach na tabeli chciałbyś uruchomić numerowanie IDENTITY od poczatku. Jak to zrobić?  Zobacz przykład:

CREATE TABLE TestIdentity
(Id INT IDENTITY,
Name VARCHAR(100));
INSERT INTO TestIdentity VALUES (‚a’),(‚b’),(‚c’)
SELECT * FROM TestIdentity
Id          Name
----------- ----------
1           a
2           b
3           c
(3 row(s) affected)

Kiedy kasujesz rekordy z takiej tabeli  okazuje się, że nadawane s im numery z zachowaniem wcześniej użytych np.

DELETE FROM TestIdentity
INSERT INTO TestIdentity VALUES (‚d’),(‚e’),(‚f’)
SELECT * FROM TestIdentity
Id          Name
----------- ----------
4           d
5           e
6           f
(3 row(s) affected)

Jeżeli chcesz aby numeracja znowu zaczęła się od jedynki uzyj funkcji DBCC CHECKIDENT. Najpierw jednak wykasujmy niepotrzebne rekordy (nie  jest to konieczne, ale przykład będzie łatwiej analizować):

DELETE FROM TestIdentity

Teraz przestawiamy IDENTITY na „od zera”.

DBCC CHECKIDENT(TestIdentity, RESEED, 0)

Polecenie zmienia wartość, od której będzie generować nowe wartości IDENTITY i wyświetla na ten temat komunikat diagnostyczny:

Checking identity information: current identity value '6', current column value '0'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Jeżeli teraz wstawisz nowe rekordy:

INSERT INTO TestIdentity VALUES (‚g’),(‚h’),(‚i’)
SELECT * FROM TestIdentity
Id          Name
----------- ----------
1           g
2           h
3           i
(3 row(s) affected)

Jeżeli tabela nie jest połaczona z innymi tabelami poprzez klucze obce, a twoim celem jest wykasować wszystkie rekordy i ustawić IDENTITY na 1, to możesz się również posłużyć poleceniem TRUNCATE TABLE. Truncate table zwraca cały obszar dysku do bazy danych i ustawia INENTITY tak, że numeracja rozpocznie się od poczatku:

TRUNCATE TABLE TestIdentity
INSERT INTO TestIdentity VALUES (‚j’),(‚k’),(‚l’)
SELECT * FROM TestIdentity
Id          Name
----------- ----------
1           j
2           k
3           l
(3 row(s) affected)

Komentarze są wyłączone

Autor: Rafał Kraik