Сбросить значение IDENTITY

16

У меня есть таблица со столбцом IDENTITY. В процессе разработки я время от времени удаляю строки и добавляю их снова. Но значения IDENTITY всегда увеличивались и не начинались с 1, когда я снова их добавлял. Теперь мой идентификатор идет от 68 -> 92, и это приводит к сбою моего кода.

Как мне сбросить значение IDENTITY?

Гис
источник
Я бы сделал свой код более устойчивым к отсутствующим значениям идентичности. Столбец идентификаторов не гарантирует непрерывную нумерацию, и будет в конечном итоге произойдет
Trubs

Ответы:

29

Вы можете сбросить значение идентичности с помощью

DBCC CHECKIDENT('tableName', RESEED, 0)

Поэтому в следующий раз при вставке в TableName значение идентификатора будет равно 1.

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

Теперь, когда вы усекаете таблицу, она сбрасывает значение Identity к исходному значению Seed таблицы.

Обратитесь к: SQL SERVER - DELETE, TRUNCATE и RESEED Identity для подробного примера и хорошего объяснения различий между усечением и удалением

Кин Шах
источник
22

Кин показал вам, как вы можете сбросить значение IDENTITY, но за пределами среды разработки, когда вы действительно удаляете все данные, зачем вам это нужно?

Я надеюсь, что вы не собираетесь поддерживать непрерывную последовательность значений IDENTITY во время работы. И я надеюсь, что вы на самом деле не пишете свой код для жесткого кодирования значений IDENTITY. Если это значимые значения идентификаторов, вам следует прекратить использование свойства IDENTITY.

Есть несколько вещей, которые предотвратят это:

  • если значение IDENTITY назначено во время транзакции, и транзакция откатывается, значение не «возвращается», и следующее значение будет тем, которое никогда не использовалось + 1.
  • если строка позже удаляется, IDENTITY никогда не возвращается, чтобы заполнить пробелы.
  • в SQL Server 2012 существует активная ошибка, которая не будет исправлена ​​до тех пор, пока SQL Server 2014 никогда не будет исправлен (если только вы не используете недокументированный и очень дорогой флаг трассировки), в результате чего при перезапуске будет отбрасываться до 1000 значений из столбца IDENTITY. , Ошибка в Connect предполагает, что это ограничено событиями отработки отказа, связанными с группами доступности, но я могу заверить вас, что ошибка намного более обширна, чем эта.

Короче говоря, если вы заботитесь о пробелах или хотите придать этим значениям особое значение, прекратите использовать IDENTITY. Удалите и заново создайте таблицу, а когда вам нужно удалить значения и заново заполнить, либо выполните обновление, либо выполните вставку с жестко заданными значениями для этого столбца.

Кроме того, первичный ключ и идентичность не одно и то же. Столбец идентификации не является первичным ключом, если вы явно не определите его как таковой, и у вас может быть первичный ключ, который не является столбцом идентификации.

Аарон Бертран
источник
-4

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

  1. сначала удалите последние записи, которые «прыгнули»
  2. измените тип данных вашего поля идентификации (от int до bigint или наоборот)
  3. сохранить таблицу
  4. добавить новую запись и проверить, назначает ли номер наибольшее значение + 1
  5. Замените тип данных вашего поля идентичности, как вам удобно.

и вы сделали.

Рамон Байгес Миро
источник
3
«Сохранить таблицу» не является значимым утверждением для SQL Server. Изменение типов данных может быть тривиальным с менее чем 100 строками, но может оказаться очень дорогим для больших таблиц.
Майкл Грин
2
Я предполагаю, что вы имеете в виду в SSMS. Это создаст новую таблицу, скопирует в нее все строки, удалит старую таблицу и переименует новую. И вам нужно сделать это дважды, чтобы переключить тип данных обратно. Он использует кувалду, чтобы взломать орех.
Мартин Смит,