SQL Reset Identity ID в уже заполненной таблице


Привет всем. У меня есть таблица в моей БД, которая содержит около тысячи записей. Я хотел бы сбросить столбец идентификаторов, чтобы все идентификаторы снова были последовательными. Я смотрел на это , но я предполагаю, что это работает только на пустой таблице

Текущая Таблица

ID    |    Name
1           Joe
2           Phil
5           Jan
88          Rob

Желаемая Таблица

ID    |    Name
1           Joe
2           Phil
3           Jan
4           Rob

Заранее спасибо

6 6

6 ответов:

Самый простой способ - сделать копию текущей таблицы, исправить все родительские проблемы, удалить ее, а затем переименовать новую.

Вы также можете временно удалить IDENTITY и попробовать следующее:

;WITH TBL AS
(
  SELECT *, ROW_NUMBER(ORDER BY ID) AS RN
  FROM CURRENT_TABLE
)
UPDATE TBL
SET ID = RN

Или, если вас не волнует порядок записей, это

DECLARE INT @id;
SET @id = 0;

UPDATE CURRENT_TABLE
SET @id = ID = @id + 1;

Один из способов, обернуть это в транзакцию

select id,name into #temp from YourTable

      truncate table YourTable

      insert YourTable (name)
      select name from #temp

Быстрое решение будет заключаться в следующем:

  1. Создайте новую таблицу с той же схемой
  2. скопируйте старую таблицу в новую (кроме столбца identity)
  3. удалить старую таблицу
  4. переименовать новую таблицу

Поскольку у вас есть внешние ключи в той же таблице (в соответствии с вашим комментарием), вам нужно будет сохранить сопоставление от старого к новому где-то и повторно установить внешние ключи, чтобы соответствовать новым идентификаторам.

Для этого есть несколько подходов, но я бы сильно сомневался в необходимости обновления первичных ключей, тем более что у вас уже есть внешние ключи, ссылающиеся на них, и это всего лишь суррогатный ключ. Это не похоже на то, что вы меняете свой суррогатный ключ на GUID или что-то в этом роде специальный.

Вот как я сбрасываю поля идентификации. Приведенная выше версия CTE (Common Table Expression) является излишней. Просто используйте текущий номер строки для обновления столбца identity с помощью простого оператора update с соединением:

UPDATE [YourTable] SET ID = rn.RowNumber FROM [YourTable]
JOIN (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber
  FROM [YourTable]) rn ON rn.ID = [YourTable].ID

Это утверждение можно переформулировать еще проще. Если да, то я хотел бы увидеть более простую версию.

Я надеюсь, что это кому-то поможет.

ИспользуйтеDBCC CHECKIDENT . таблица не должна быть пустой:

  • DBCC CHECKIDENT ( table_name, NORESEED)

Текущее значение идентификатора не сбрасывается. DBCC CHECKIDENT возвращает текущий значение идентичности и текущий максимум значение столбца идентификаторов. Если две ценности-это не одно и то же, вы следует сбросить значение идентификатора в избегайте потенциальных ошибок или пробелов в последовательность значений.

  • DBCC CHECKIDENT ( table_name ) или DBCC CHECKIDENT ( table_name, RESEED )

Если текущая идентичность значение для a таблица меньше максимальной значение идентификатора, хранящееся в идентификаторе колонну, он устанавливается в максимальное значение в столбце идентификаторов.

  • DBCC CHECKIDENT ( table_name, RESEED, new_reseed_value )

Текущее значение идентификатора устанавливается в значение new_reseed_value. Если никаких строк не было вставляется в таблицу с момента таблица была создана, или если все строки имеют был удален с помощью усечения Оператор таблицы, первая строка вставлены после того, как вы выполните инструкцию DBCC checkident, будет использует значение new_reseed_value в качестве идентичность. В противном случае следующая вставленная строка использует new_reseed_value + текущий значение приращения.

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

  • Если существует ограничение первичного ключа или уникальности для идентификатора столбец, сообщение об ошибке 2627 будет генерируется при последующих операциях вставки в таблицу, потому что сгенерированный значение идентичности будет конфликтовать с существующие ценности.

  • Если первичный ключ или уникальное ограничение не существует, то позже операции вставки приведут к дублирование значений идентичности.