2012-03-29 87 views
5

我知道如何更新SQL中的多個表的問題已經被問到過,並且常見的答案似乎是在事務中單獨進行。如何更新2個表中具有外鍵的2列

但是,我需要更新的2列有一個外鍵,因此無法單獨更新。

例如

Table1.a是一個外鍵Table2.a

表中的一個條目是錯誤的,例如兩列都是'xxx',應該是'yyy'

如何將Table1.a和Table2.a更新爲'yyy'?

我知道我可以臨時刪除密鑰並更換,但肯定還有另一種方法。

謝謝

回答

10

您不能同時執行更新,但是您可以強制SQL執行更新。您需要確保您的外鍵具有參考觸發動作ON UPDATE CASCADE

例如,

ALTER TABLE YourTable 
ADD CONSTRAINT FK_YourForeignKey 
FOREIGN KEY (YourForeignKeyColumn) 
REFERENCES YourPrimaryTable (YourPrimaryKeyColumn) ON UPDATE CASCADE 
+0

謝謝,這清除了事實,我不能。 Cascade工作得很好。 – Sunrise 2012-03-29 09:09:38

+0

+1也是我的! – 2012-03-29 12:19:29

2

我的答案是基於以下鏈接:http://msdn.microsoft.com/en-us/library/ms174123%28v=SQL.90%29.aspx

你需要確保你的table_constraint將被定義爲ON UPDATE CASCADE

  CREATE TABLE works_on1 
     (emp_no INTEGER NOT NULL, 
      project_no CHAR(4) NOT NULL, 
      job CHAR (15) NULL, 
      enter_date DATETIME NULL, 
      CONSTRAINT prim_works1 PRIMARY KEY(emp_no, project_no), 
      CONSTRAINT foreign1_works1 FOREIGN KEY(emp_no) REFERENCES employee(emp_no) ON DELETE CASCADE, 
      CONSTRAINT foreign2_works1 FOREIGN KEY(project_no) REFERENCES project(project_no) ON UPDATE CASCADE) 

,然後當你會改變的價值您的主鑰匙

請參閱以下報價:

對於ON DELETE或ON UPDATE,如果指定CASCADE選項,則在引用表中更新 行,如果在父表中更新了相應的 引用行。如果NO ACTION指定爲 ,則SQL Server Compact Edition將返回一個錯誤,並且回滾父表中引用行的更新 操作。

例如,您可能在數據庫中有兩個表A和B.表 A與表B有參照關係:A.ItemID外鍵 鍵引用B.ItemID主鍵。

如果一個UPDATE語句對錶B中的行和ON UPDATE CASCADE操作執行時用於A.ItemID指定的SQL Server Compact表A的一個或多個相關行 版檢查是否有任何 存在,表A從屬行被更新,如在表B中引用

可替換地,如果沒有指定動作是行 ,SQL Server精簡版 返回一個錯誤並回退引用 更新動作當表A中至少有一行 引用它時,在表B中成行。

+0

謝謝,級聯更新效果很好。 – Sunrise 2012-03-29 09:10:30

2

並非是對級聯更新,我會建議不同的路線風扇。

首先,你不更新父表,你添加一個新的紀錄,你想要的值(與相同的數據作爲所有其他領域的其他記錄)。然後,您無需更新子表即可使用此值而不是該值。另外你現在必須做批量的工作,以避免鎖定系統啓動而改變頒佈通過它的能力。一旦所有的子表已經更新,你可以刪除原來的壞記錄。

+0

感謝您的回答,除了我需要保持相同的標識字段和有唯一索引上的其它4列,以及這將限制需要你的方法他們重複這聽起來不錯。 – Sunrise 2012-03-29 14:22:08