我知道如何更新SQL中的多個表的問題已經被問到過,並且常見的答案似乎是在事務中單獨進行。如何更新2個表中具有外鍵的2列
但是,我需要更新的2列有一個外鍵,因此無法單獨更新。
例如
Table1.a是一個外鍵Table2.a
表中的一個條目是錯誤的,例如兩列都是'xxx',應該是'yyy'
如何將Table1.a和Table2.a更新爲'yyy'?
我知道我可以臨時刪除密鑰並更換,但肯定還有另一種方法。
謝謝
我知道如何更新SQL中的多個表的問題已經被問到過,並且常見的答案似乎是在事務中單獨進行。如何更新2個表中具有外鍵的2列
但是,我需要更新的2列有一個外鍵,因此無法單獨更新。
例如
Table1.a是一個外鍵Table2.a
表中的一個條目是錯誤的,例如兩列都是'xxx',應該是'yyy'
如何將Table1.a和Table2.a更新爲'yyy'?
我知道我可以臨時刪除密鑰並更換,但肯定還有另一種方法。
謝謝
您不能同時執行更新,但是您可以強制SQL執行更新。您需要確保您的外鍵具有參考觸發動作ON UPDATE CASCADE
例如,
ALTER TABLE YourTable
ADD CONSTRAINT FK_YourForeignKey
FOREIGN KEY (YourForeignKeyColumn)
REFERENCES YourPrimaryTable (YourPrimaryKeyColumn) ON UPDATE CASCADE
我的答案是基於以下鏈接: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中成行。
謝謝,級聯更新效果很好。 – Sunrise 2012-03-29 09:10:30
並非是對級聯更新,我會建議不同的路線風扇。
首先,你不更新父表,你添加一個新的紀錄,你想要的值(與相同的數據作爲所有其他領域的其他記錄)。然後,您無需更新子表即可使用此值而不是該值。另外你現在必須做批量的工作,以避免鎖定系統啓動而改變頒佈通過它的能力。一旦所有的子表已經更新,你可以刪除原來的壞記錄。
感謝您的回答,除了我需要保持相同的標識字段和有唯一索引上的其它4列,以及這將限制需要你的方法他們重複這聽起來不錯。 – Sunrise 2012-03-29 14:22:08
謝謝,這清除了事實,我不能。 Cascade工作得很好。 – Sunrise 2012-03-29 09:09:38
+1也是我的! – 2012-03-29 12:19:29