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 ответов:
Самый простой способ - сделать копию текущей таблицы, исправить все родительские проблемы, удалить ее, а затем переименовать новую.
Вы также можете временно удалить
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
Быстрое решение будет заключаться в следующем:
- Создайте новую таблицу с той же схемой
- скопируйте старую таблицу в новую (кроме столбца identity)
- удалить старую таблицу
- переименовать новую таблицу
Поскольку у вас есть внешние ключи в той же таблице (в соответствии с вашим комментарием), вам нужно будет сохранить сопоставление от старого к новому где-то и повторно установить внешние ключи, чтобы соответствовать новым идентификаторам.
Для этого есть несколько подходов, но я бы сильно сомневался в необходимости обновления первичных ключей, тем более что у вас уже есть внешние ключи, ссылающиеся на них, и это всего лишь суррогатный ключ. Это не похоже на то, что вы меняете свой суррогатный ключ на 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 будет генерируется при последующих операциях вставки в таблицу, потому что сгенерированный значение идентичности будет конфликтовать с существующие ценности.
Если первичный ключ или уникальное ограничение не существует, то позже операции вставки приведут к дублирование значений идентичности.