Идентификатор Идентификационных данных Сброса SQL в уже заполненной таблице

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

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

ID    |    Name
1           Joe
2           Phil
5           Jan
88          Rob

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

ID    |    Name
1           Joe
2           Phil
3           Jan
4           Rob

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

6
задан Chase Florell 12 March 2013 в 17:01
поделиться

5 ответов

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

Вы также можете временно удалить 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;
5
ответ дан 10 December 2019 в 00:35
поделиться

Быстрое решение:

  1. создать новую таблицу с той же схемой
  2. скопировать старую таблицу в новую (за исключением столбца идентификаторов)
  3. удалить старую таблицу
  4. переименовать новая таблица
1
ответ дан 10 December 2019 в 00:35
поделиться

Используйте 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 не существует, последующие операции вставки приведут к повторяющимся значениям идентичности.

-1
ответ дан 10 December 2019 в 00:35
поделиться

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

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

1
ответ дан 10 December 2019 в 00:35
поделиться

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

select id,name into #temp from YourTable

      truncate table YourTable

      insert YourTable (name)
      select name from #temp
3
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: