2015-06-30 8 views
-1

У меня есть таблица с столбцом идентификатора первичного ключа и устанавливается для увеличения 1 для каждой новой записи, довольно стандартной конфигурации. Эта таблица регулярно обновляется новыми записями и архивируется один раз в месяц в архивной таблице, а затем усекается.Идентификация столбца столбца SQL Server Нумерация

При нормальной работе следующая запись, попадающая в таблицу после усечения, будет иметь значение следующего идентификатора, гарантируя, что в таблице ID и таблице «жить» нет совпадений в идентификаторах.

Из-за неизвестных факторов, как-то столбец Идентификатор в живой таблице «вернул» обратно к идентификатору, который уже использовался. Поскольку эта база данных была разработана плохо, теперь у меня есть некоторые проблемы с целостностью данных.

Мое решение проблемы заключается в обновлении столбца идентификатора для всех записей в «живой» таблице, чтобы не было совпадений с идентификаторами, которые существуют в таблице «архив». Как только я обновляю идентификаторы, я обновлю столбец Identity, чтобы будущие записи также не перекрывались.

Мой вопрос не в том, чтобы переместить столбец (используя DBCC - я знаю, как это сделать), но и о том, как переделать существующие записи с новыми значениями ID. Должен ли я делать это с помощью циклического динамического SQL-запроса (удалить запись, вставить запись) или есть какая-то функция SQL Server, о которой я не знаю, что может автоматически перенумеровать столбец идентификатора?

+1

Не знаю, почему вы нужен цикл или динамический SQL. 'НАЧАТЬ ПЕРЕВОД; DECLARE @i INT; SELECT @i = MAX (id) FROM dbo.table WITH (HOLDLOCK); INSERT dbo.table (othercols) SELECT othercols FROM dbo.table; DELETE dbo.table WHERE id <= @i; COMMIT TRANSACTION; ' –

+0

Это тот тип ответа, который я искал, спасибо! Я знаю, что он не нужен dyn SQL обязательно, просто не мог придумать умный способ сделать это. Если вы поместите это в ответ вместо комментария, я отмечу его «принято». – LegendaryDude

ответ

1

Это выглядит как дубликат этого вопроса - How to update Identity Column in SQL Server?

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

+0

Если это дубликат, то * flag * как дубликат. – LittleBobbyTables

+0

Я не могу, потому что эта возможность доступна только для пользователей с более высокими повторениями. Единственный способ ответить - отправить ответ. http://meta.stackexchange.com/questions/217242/why-dont-i-see-the-option-to-mark-a-question-as-a-duplicate –

+0

Да, я никогда не понимал, что это флаг (в 15 репутация) отличалась от маркировки как дубликата (по 50 репутации). Мои извинения! – LittleBobbyTables

0

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

with myCTE as (
select row_number() over (order by auditDate) + 0 rn/*This is whatever you want the ID's to start at*/, * from testTable 
) 
update myCTE set id= rn; 

Вот SQL скрипку (я использовал очень простую таблицу из другого примера я имел, но это должно быть легко увидеть, что происходит)

http://sqlfiddle.com/#!3/ef0b36/1

+0

Почему вы устанавливаете dbsize на 0 непосредственно перед его обновлением? Отходы писем. Вы не можете использовать общие табличные выражения в sqlserver 2005 –

+0

, это были плохие имена тестовых таблиц. Я обновил его в своем ответе (скрипт sql остается тем же, хотя). Я устанавливаю все ID на 0. –

+0

@ t-clausen.dk возможно вы думаете 2000? CTE отлично работают в SQL Server 2005. –

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