перенумеровать первичный ключ - PullRequest
8 голосов
/ 23 октября 2008

Как мне сбросить счетчик первичного ключа в таблице sql и обновить каждую строку новым первичным ключом?

Ответы [ 6 ]

14 голосов
/ 23 октября 2008

Я бы сначала добавил в таблицу еще один столбец, заполнив его новым PK.

Тогда я бы использовал операторы update для обновления новых полей fk во всех связанных таблицах.

Затем вы можете удалить старые поля PK и старые поля fk.

РЕДАКТИРОВАТЬ: Да, как говорит Ян, вам придется отбросить, а затем воссоздать все ограничения внешнего ключа.

6 голосов
/ 23 октября 2008

Не уверен, какую СУБД вы используете, но если это SQL Server:

SET IDENTITY_INSERT [MyTable] ON

позволяет обновить / вставить столбец первичного ключа. Затем, когда вы закончите обновление ключей (вы можете использовать CURSOR для этого, если логика сложна)

SET IDENTITY_INSERT [MyTable] OFF

Надеюсь, это поможет!

2 голосов
/ 23 октября 2008

Это может быть или не быть специфичным для MS SQL, но: TRUNCATE TABLE сбрасывает счетчик идентификаторов, поэтому одним из способов сделать это быстро и грязно было бы 1) Сделать резервную копию 2) Скопируйте содержимое таблицы во временную таблицу: 3) Скопируйте содержимое временной таблицы обратно в таблицу (в которой есть столбец идентификаторов):

SELECT Field1, Field2 INTO #MyTable FROM MyTable

TRUNCATE TABLE MyTable

INSERT INTO MyTable
(Field1, Field2)
SELECT Field1, Field2 FROM #MyTable

SELECT * FROM MyTable
-----------------------------------
ID    Field1    Field2
1     Value1    Value2
1 голос
/ 23 октября 2008

вы можете сделать это в следующие шаги:

  • создать копию yourTable с дополнительным столбцом new_key
  • заполнить copyOfYourTable соответствующими строками из yourTable вместе с желаемыми значениями new_key
  • временно отключить ограничения
  • обновить все связанные таблицы, указав значение new_key вместо old_key
  • удалить затронутые строки из вашей таблицы
  • SET IDENTITY_INSERT [yourTable] ON
  • снова вставить затронутые строки с новым правильным значением ключа (из таблицы копирования)
  • SET IDENTITY_INSERT [yourTable] OFF
  • Повторная идентификация
  • повторно включить ограничения
  • удалить копию из таблицы

Но, как говорили другие, вся эта работа не нужна. Я склонен смотреть на первичные ключи идентифицирующего типа, как если бы они были эквивалентны указателям в C, я использую их для ссылки на другие объекты, но никогда не изменяю доступ к ним явно

1 голос
/ 23 октября 2008

Зачем вам вообще беспокоиться? Весь смысл первичных ключей «идентичности», основанных на счетчиках, состоит в том, что числа являются произвольными и бессмысленными.

0 голосов
/ 23 октября 2008

Если это SQL-сервер Microsoft, вы можете использовать [dbcc checkident] (http://msdn.microsoft.com/en-us/library/ms176057(SQL.90).aspx)

Предположим, у вас есть одна таблица, в которой вы хотите перемещаться по данным вместе с перенумерацией первичных ключей. Например, имя таблицы ErrorCode . Он имеет два поля: ErrorCodeID (который является первичным ключом) и Описание .

Пример кода с использованием dbcc checkident

-- Reset the primary key counter
dbcc checkident(ErrorCode, reseed, 7000)

-- Move all rows greater than 8000 to the 7000 range
insert into ErrorCode
select Description from ErrorCode where ErrorCodeID >= 8000

-- Delete the old rows
delete ErrorCode where ErrorCodeID >= 8000

-- Reset the primary key counter
dbcc checkident(ErrorCode, reseed, 8000)

В этом примере вы фактически переместите все строки на другой первичный ключ, а затем сбросите их, чтобы при следующей вставке использовался идентификатор 8000.

Надеюсь, это немного поможет!

...