Это, вероятно, легче объяснить с помощью некоторого кода:
CREATE TABLE YourTable (ID int IDENTITY(1,1),
SomeCol varchar(5));
INSERT INTO dbo.YourTable (SomeCol)
VALUES('abc'); --Will get ID 1
INSERT INTO dbo.YourTable (SomeCol)
VALUES('def'),('ghi'); --Will get 2 and 3.
SELECT *
FROM dbo.YourTable;
DELETE FROM dbo.YourTable;
INSERT INTO dbo.YourTable (SomeCol)
VALUES('abc'); --Will get ID 4, because 1-3 have been used. Deleting doesn't let you reuse values.
SELECT *
FROM dbo.YourTable;
DELETE FROM dbo.YourTable;
DBCC CHECKIDENT ('dbo.YourTable', RESEED, 1);
INSERT INTO dbo.YourTable (SomeCol)
VALUES('abc'); --Will get ID 2, as you seeded back to 1; so the NEXT ID is used.
SELECT *
FROM dbo.YourTable;
TRUNCATE TABLE dbo.YourTable;
INSERT INTO dbo.YourTable (SomeCol)
VALUES('abc'); --Will get ID 4, because 1-3 have been used.
SELECT *
FROM dbo.YourTable; --Will get ID 1, as the column was reseed with the TRUNCATE
DROP TABLE dbo.YourTable;
Для вашего конкретного вопроса о повторном заполнении, следующее значение после начального числа, которое вы определяете - это использование. Семя, которое вы определяете, - это то, которое вы говорите, использовалось в последний раз. Это описано в документации Преобразование текущего значения идентификатора в новое значение :
Поскольку в таблице есть существующие строки, следующая вставленная строка будет использовать 11
в качестве значения - новое текущее значение идентификатора, определенное для столбца
плюс 1 (значение приращения столбца).
Единственный способ определить таблицу, не имеющую существующих строк, - это TRUNCATE
it, что я и сделаю позже в приведенном выше пакете (и почему 1 используется повторно).
В конце дня значение вашего IDENTITY
не имеет смысла, кроме как предоставить строке одноразовое значение (которое не гарантируется, чтобы быть уникальным само по себе). В сочетании с ограничениями Первичный ключ / Уникальный он является хорошим кандидатом в кластеризованный индекс, поскольку следующее значение всегда больше последнего использованного значения, а значения не используются повторно.
Если важно иметь последовательные значения, то вам нужно использовать SEQUENCE
, а не свойство IDENTITY
. Последний не гарантирует уникальности или последовательных значений сам по себе (поскольку они могут быть пропущены из-за удалений, неудачных вставок, неожиданного выключения и т. Д.), Но он гарантирует, что не будет повторно использовать значения, если они были (без RESEED
): IDENTITY (Transact-SQL) - Примечания . SEQUENCE
может использоваться, чтобы гарантировать, что значения действительно последовательны (кроме как из-за DELETE
).