SQL Server продолжает подсчет идентификаторов после усечения таблицы

Кажется, я помню, что в MySQL при усечении таблицы автоматически увеличивающееся поле индекса продолжалось с того места, где оно было остановлено. Таким образом, если указанная таблица была усечена с наивысшим идентификатором 100, следующим идентификатором после усечения будет 101.

Есть ли способ сделать это в SQL Server? Я усек свою таблицу с более чем 1000 строк, но после усечения следующий новый идентификатор вернулся к 1 в моем столбце идентификаторов. Я хотел бы, чтобы это продолжалось.


person ckpepper02    schedule 01.07.2013    source источник
comment
В этом случае TRUNCATE перезапустит ваш столбец идентификации. Если вы используете DELETE, то этого не произойдет   -  person Lamak    schedule 01.07.2013


Ответы (3)


DBCC CHECKIDENT (<table name>, reseed, 1000) должно помочь.

Обратите внимание, что повторное заполнение, показанное выше, будет означать, что следующим числом будет 1001, поэтому установите значение 999, если вы хотите, чтобы следующим идентификатором было 1000.

Эта статья объясняет немного больше.

person GrandMasterFlush    schedule 01.07.2013
comment
Мое тестирование на MSSQL2014 показывает, что если вы заполните его до 1000, следующая запись будет 1000, а не 1001. Это логически согласуется с идентификатором (1,1), имеющим первую запись 1, а не 2. - person Grubsnik; 26.03.2015

Основываясь на ответе GrandMasterFlush, вот сценарий, который я использую для достижения этой функциональности «урезать, но сохранить начальное число», предполагая, что ваш идентификатор bigint.

declare @id bigint
select @id = IDENT_CURRENT('MyTable')
print(@id)
truncate table MyTable
dbcc checkident (MyTable, reseed, @id)
person Robino    schedule 28.03.2018

Из MSDN:

Если таблица содержит столбец идентификаторов, счетчик для этого столбца сбрасывается до начального значения, определенного для столбца. Если начальное значение не было определено, используется значение по умолчанию 1. Чтобы сохранить счетчик идентификаторов, используйте вместо него DELETE.

Если вы настроены на усечение таблицы, вы можете вручную найти максимальный идентификатор перед усечением, а затем повторно заполнить таблицу, используя DBCC CHECKIDENT.

person Adrian Wragg    schedule 01.07.2013
comment
Удалить очень медленно по сравнению с усечением. - person Robino; 28.03.2018