эй все. У меня есть таблица в моем DB, который имеет приблизительно тысячу записей в ней. Я хотел бы сбросить столбец идентификационных данных так, чтобы весь идентификатор был последователен снова. Я смотрел на это, но я Предполагаю, что это только работает над пустой таблицей
Текущая таблица
ID | Name
1 Joe
2 Phil
5 Jan
88 Rob
Желаемая таблица
ID | Name
1 Joe
2 Phil
3 Jan
4 Rob
Заранее спасибо
Самый простой способ - сделать копию текущей таблицы, исправить все связанные проблемы, отбросить ее и затем переименовать новую.
Вы также можете временно удалить 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;
Быстрое решение:
Используйте DBCC CHECKIDENT . таблица не должна быть пустой:
DBCC CHECKIDENT (table_name, NORESEED)
Текущее значение идентификатора не сбрасывается. DBCC CHECKIDENT возвращает текущее значение идентификатора и текущее максимальное значение столбца идентификаторов. Если два значения не совпадают, вам следует сбросить значение идентификатора на , чтобы избежать потенциальных ошибок или пробелов в последовательности значений.
DBCC CHECKIDENT (имя_таблицы)
илиDBCC CHECKIDENT (имя_таблицы, RESEED)
Если текущее значение идентификатора для таблицы меньше максимального значения идентификатора хранится в столбце идентификатора , он сбрасывается с использованием максимального значения в столбце идентификатора.
DBCC CHECKIDENT (table_name, RESEED, new_reseed_value)
Текущее значение идентификатора установлено на new_reseed_value. Если строки не были вставлены в таблицу с момента создания таблицы , или если все строки были удалены с помощью оператора TRUNCATE TABLE, то первая строка , вставленная после запуска DBCC CHECKIDENT , использует new_reseed_value в качестве идентификатора. В противном случае следующая вставленная строка использует new_reseed_value + текущее значение приращения.
Если таблица не пуста, установка значения идентификатора на число меньше максимального значения в столбце идентификатора может привести к одному из значений {{1} }} следующие условия:
Если для столбца идентификаторов существует ограничение PRIMARY KEY или UNIQUE, сообщение об ошибке 2627 будет сгенерировано при последующих операциях вставки в таблицу, потому что сгенерированное значение идентификатора будет конфликтовать с существующими значениями .
Если ограничение PRIMARY KEY или UNIQUE не существует, последующие операции вставки приведут к повторяющимся значениям идентичности.
Поскольку у вас есть внешние ключи в той же таблице (согласно вашему комментарию), вам нужно будет где-то сохранить сопоставление от старого к новому и восстановить внешние ключи для соответствия новым идентификаторам.
Для этого есть несколько подходов, но я бы сильно сомневался в необходимости обновления ваших первичных ключей, тем более что у вас уже есть ссылающиеся на них внешние ключи, а это просто суррогатный ключ. Это не значит, что вы меняете свой суррогатный ключ на GUID или что-то особенное.
один из способов, оберните это в транзакцию
select id,name into #temp from YourTable
truncate table YourTable
insert YourTable (name)
select name from #temp