SQL Server: изменить первичный ключ со связанными строками - PullRequest
6 голосов
/ 05 июля 2010

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

Например

Table Person { Id, Name, +50 fields }
Table Address { Id, City, +10 fields }
Table Person2Address { Id, PersonId, AddressId }

Я хочу изменить Person.Id и Person2Address.PersonId

Я пытаюсь что-то вроде:

BEGIN TRANSACTION    
  UPDATE Pers SET Id = NewId WHERE Id = OldId
  UPDATE Person2Address SET PersonId = NewId WHERE PersonId = OldId
COMMIT TRANSACTION

Но, конечно, это создает конфликты:)

Как я могу временно подавить ограничения внешнего ключа или есть лучший способ изменить Id для человека?

Ответы [ 3 ]

4 голосов
/ 05 июля 2010

Прежде всего, изменение значения первичного ключа никогда не является хорошей идеей. Ваша главная цель должна состоять в том, чтобы попытаться избежать этого всеми средствами.

Если вы не можете устранить необходимость обновления значения первичного ключа, то лучше всего было бы определить отношение внешнего ключа между этими двумя таблицами для использования ON UPDATE CASCADE, чтобы любые изменения первичного ключа основной таблицы автоматически каскадно спуститься к дочернему столу.

Чтобы сделать это, удалите существующую связь с внешним ключом и добавьте:

 ALTER TABLE dbo.Person2Address
   ADD CONSTRAINT FK_Person2Address_Person
   FOREIGN KEY (PersonId) REFERENCES dbo.Person(Id)
     ON UPDATE CASCADE

Это должно затем автоматически обновить значение PersonId таблицы Person2Address, если Id на человеке изменится.

Теперь вы можете просто позвонить

UPDATE dbo.Person SET Id = NewId WHERE Id = OldId

и это должно быть все, что есть!

2 голосов
/ 05 июля 2010

Для таких вещей проще всего использовать что-то вроде:

BEGIN TRANSACTION    
  UPDATE Pers SET tempId = NewId WHERE Id = OldId
  UPDATE Person2Address SET tempPersonId = NewId WHERE PersonId = OldId
COMMIT TRANSACTION

Затем удалите поля Id и PersonId и переименуйте временные.

1 голос
/ 05 июля 2010

Вы можете удалить ограничения FK и воссоздать их, когда закончите.

ALTER TABLE some_table DROP CONSTRAINT my_constraint

Отметьте эту статью для создания и изменения ограничений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...