Подтвердить что ты не робот

Первичный ключ обновления SQL Server, который также является внешним ключом в двух таблицах

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

Вот мой запрос и ошибка:

begin tran
update question set questionparent = 10000, questionid= 10005 where questionid = 11000;
Error  9/4/2009 10:04:49 AM    0:00:00.000 SQL Server Database Error: The UPDATE statement conflicted with the REFERENCE constraint "FK_GoalRequirement_Question". The conflict occurred in database "numgmttest", table "dbo.GoalRequirement", column 'QuestionID'.   14  0

Я не помню, как это сделать, поэтому я здесь. Любая помощь?

4b9b3361

Ответ 1

Вы можете:

  1. временно отключить применение ограничений FK (см. здесь или здесь)
  2. обнови свой ПК
  3. обновите свои ФК
  4. включить обратно принудительное применение ограничений FK

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

Но... зачем вам менять ПК? Я надеюсь, что это действие, которое выполняется редко (устаревший импорт данных или что-то в этом роде).

Ответ 2

Используются ли ваши отношения с помощью

ON UPDATE CASCADE 

Если они затем меняют ключ в первичной таблице, будут обновлены внешние ключи.

например.

ALTER TABLE Books 
ADD CONSTRAINT fk_author 
FOREIGN KEY (AuthorID) 
REFERENCES Authors (AuthorID) ON UPDATE CASCADE 

Ответ 3

Если вы хотите установить правило Cascade графически, то установите Cascade Rule на SQL Management Studio

  • Открыть таблицу в режиме разработки
  • Нажмите кнопку "Связь" с верхней панели инструментов
  • Выберите требуемые отношения FK (один за другим)
  • Правая сторона - развернуть спецификацию INSERT или UPDATE
  • Измените правило UPDATE на - Cascade

Закрыть и сохранить, Готово!

(Пробовал на SQL 2008)

Ответ 4

Поскольку я не слишком уверен в отключении ограничений FK, я тоже предпочитаю:

  • Дублируйте строку со старым PK с одним с новым PK
  • Обновить FK
  • Удалить строку со старым PK

Преимущество: во время процесса не было нарушено ограничение.

Ответ 5

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

Ответ 6

-create à Новая строка с теми же данными и à другим первичным ключом. -update все детские столы. -remove строка, в которой вы повторяли свои данные И это сделано.