簡體   English   中英

SQL Server:更新外鍵引用完整性

[英]SQL Server : updating foreign key referential integrity

我在SQL Server數據庫中具有以下表:A,B和C

  • A具有主鍵ID
  • B有一個包含IDA_ID的主鍵。 A_ID也是一個外鍵A.ID
  • C具有主鍵ID和包含A_IDB_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將具有無效的外鍵。

SQL小提琴在這里

我想做到這一點的一種方法是刪除C中的外鍵約束,並在查詢運行后重新創建它。 有沒有一種方法可以在不更改表結構的情況下執行此操作?

當您希望能夠更改FK引用的表的PK時,可以如前所述,刪除並重新創建FK。

或者,您可以使用ON UPDATE CASCADE重新創建FK。

這意味着,如果FK引用的PK發生更改,則FK也將自動更改。

編輯:如果您的意思是可以完全不降低或更改FK來執行此操作,那么正如Rich Brenner在評論中建議的那樣,您可以分兩個(四個,實際上)階段進行“更新”,首先創建數據需要,然后刪除不再需要的數據:

  1. 向B添加新的所需數據
  2. 將新數據添加到C,引用B中的新數據
  3. 從C刪除不需要的數據
  4. 從B刪除不需要的數據

除非我缺少任何東西,否則為什么不使用事務呢?

由於兩個表中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM