[英]SQL Server : updating foreign key referential integrity
我在SQL Server數據庫中具有以下表:A,B和C
ID
ID
和A_ID
的主鍵。 A_ID
也是一個外鍵A.ID
。 ID
和包含A_ID
和B_ID
的外鍵 我想將B和C的A_ID更新為其他記錄,例如
UPDATE B SET A_ID = 2 WHERE ID = 1
UPDATE C SET A_ID = 2 WHERE B_ID = 1
不幸的是,由於參照完整性,我將無法更新B.A_ID。 如果可以的話,C將具有無效的外鍵。
我想做到這一點的一種方法是刪除C中的外鍵約束,並在查詢運行后重新創建它。 有沒有一種方法可以在不更改表結構的情況下執行此操作?
當您希望能夠更改FK引用的表的PK時,可以如前所述,刪除並重新創建FK。
或者,您可以使用ON UPDATE CASCADE
重新創建FK。
這意味着,如果FK引用的PK發生更改,則FK也將自動更改。
編輯:如果您的意思是可以完全不降低或更改FK來執行此操作,那么正如Rich Brenner在評論中建議的那樣,您可以分兩個(四個,實際上)階段進行“更新”,首先創建數據需要,然后刪除不再需要的數據:
除非我缺少任何東西,否則為什么不使用事務呢?
由於兩個表中的A_Id
都指向A
表中的Id
列,因此我認為用單個事務中包裝的2個不同的更新語句更新每個表的記錄沒有問題。 這樣,如果更新之一失敗,則事務將回滾:
BEGIN TRY
BEGIN TRANSACTION
UPDATE b
SET a_id = 3
WHERE id = 3;
UPDATE c
SET a_id = 3
WHERE b_Id = 3;
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
END CATCH
外鍵約束應該不會造成問題。
在這里看小提琴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.