2010-05-08 3 views
5

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

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

ID | Name 
1   Joe 
2   Phil 
5   Jan 
88   Rob 

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

ID | Name 
1   Joe 
2   Phil 
3   Jan 
4   Rob 

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

+0

Этот столбец Identity используется как внешний ключ в другом месте? – uhleeka

+0

Нет, это просто уникально, потому что в таблице есть другое поле, которое ссылается на него. –

+0

IE: 'ID | ParentID | Name' –

ответ

5

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

Вы можете также временно удалить 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; 
-2

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

  • DBCC CHECKIDENT (table_name, NORESEED)

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

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

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

  • DBCC CHECKIDENT (table_name, RESEED, new_reseed_value)

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

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

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

  • Если ограничение PRIMARY KEY или UNIQUE не существует, то последующие операции вставки приведут к дублированию идентификационных значений .

+0

Это на самом деле не работает. Как говорится в статье, если я запустил «DBCC CHECKIDENT (table_name, RESEED, new_reseed_value)», то я не могу вставить новые записи, где сейчас находятся старые записи. Кажется, что единственный способ правильно сделать это - вставить данные в новую таблицу (воссоздание идентификаторов), удалить старую таблицу и затем переименовать новую таблицу в имя старой таблицы. –

+0

Это может изменить следующее значение семени вставки; не обновлять существующие значения идентичности. –

1

Быстрое решение будет до:

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

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

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

3

один способ, обернуть это в сделке

select id,name into #temp from YourTable 

     truncate table YourTable 

     insert YourTable (name) 
     select name from #temp 
+0

очень приятно! элегантный и простой. – uhleeka

+0

, но он не фиксирует ваш ParentID. – mdma

+4

В вопросе, где я ответил, ничего не было о родителе – SQLMenace

0

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

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 

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

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

Смежные вопросы