2009-09-04 111 views
19

我需要更新記錄的主鍵,但它也是另外兩個表中的外鍵。而且我需要更新的主鍵也反映在子表中。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 

我不記得如何去這樣做,所以這就是爲什麼我在這裏。任何幫助?

+0

另一種選擇:避免有一個可更改的主鍵。改爲使用IDENTITY作爲主鍵。對需要唯一的列保持唯一的約束。這可能超出了你的控制範圍,但它對我們來說很好。我們的用戶可以根據自己的需要更改ID,但不會影響實際的主鍵。 – 2009-09-04 14:23:34

回答

16

您可以:

  1. 禁止強制FK約束暫時(見herehere
  2. 更新您的PK
  3. 更新您的FKS
  4. 使背部執行FK約束

在交易中執行所有操作,並確保如果交易失敗,則將其正確回滾並繼續執行FK限制。

但是......爲什麼你需要改變PK?我希望這是一個很少執行的操作(遺留數據導入或類似的東西)。

33

是使用

ON UPDATE CASCADE 

如果他們再改變主表中的鍵將更新外鍵的關係。

例如

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

任何方式都可以在不看腳本的情況下進行分析?我沒有權限查看它。 – NMan 2009-09-04 14:18:17

+2

確定:'BEGIN TRANSACTION; DELETE FROM ParentTable WHERE ID =?; ROLLBACK;' 如果您看到FK違規,那麼FK的更新受到限制。 – van 2009-09-04 14:29:58

+0

這應該是被接受的答案。我覺得它最貼近地解決了OP的問題,並且以比目前接受的答案更好的方式進行。 – 2013-12-30 18:35:06

1

轉到外鍵每個子表的關係和對插入和更新規範更改刪除和更新規則以級聯。這可以幫助ü點點

+0

不知道爲什麼這得到了downvoted - 這與做出最高選票的答案完全一樣,只在用戶界面中而不在SQL中! – 2014-08-31 13:43:36

6

如果您想以圖形設置級聯規則,然後在SQL管理設置級聯規則工作室

  1. 在設計模式打開表
  2. 點擊關係從頂部的工具欄按鈕
  3. 選擇所需的FK關係(一一)
  4. 右側 - 展開INSERT或UPDATE規格
  5. 更改更新規則來 - 級聯

關閉並保存,完成!

(試戴SQL 2008)

+1

你是人! – 2016-12-20 10:42:43

4

由於我不是太有信心禁用FK約束,我更喜歡太:

  1. 複製與老PK行一個新PK
  2. 更新FKS
  3. 刪除行與老PK

優勢:無約束違反杜爾這個過程。