Sql-Server

無法將自引用外鍵關係的刪除規則更改為級聯刪除

  • September 19, 2013

我有下表

[dbo].[myObj]
(
   [ID] [int] IDENTITY(1,1) NOT NULL,
   [fk_ParentID] [int] NULL
)

和我的關係從fk_ParentIDID

我想在“外鍵關係”視窗->插入和更新規範->刪除規則下將 SQL Server Management Studio 中的刪除規則更改為 ON Delete Cascade,但這是不可能的。

你能告訴我為什麼,我怎樣才能做到這一點?

為了進一步澄清這個問題,我創建了一個範例模式:

USE TempDB;

CREATE TABLE [dbo].[myObj]
(
   [ID] [int] NOT NULL CONSTRAINT PK_myObj PRIMARY KEY IDENTITY(1,1),
   [fk_ParentID] [int] NULL CONSTRAINT FK_myObj_ID FOREIGN KEY 
                   REFERENCES myObj (ID) ON DELETE CASCADE
);

當您嘗試執行此 SQL 時,SQL Server 將返回以下錯誤:

消息 1785,級別 16,狀態 0,第 3 行在表“myObj”上引入 FOREIGN KEY 約束“FK_myObj_ID”可能會導致循環或多個級​​聯路徑。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 約束。

消息 1750,級別 16,狀態 0,第 3 行無法創建約束。請參閱以前的錯誤。

錯誤消息表明 SQL Server 拒絕創建外鍵級聯關係,因為刪除單行可能會導致所有行被刪除(或者可能只是多行,而不是全部,取決於表中的數據!)。

為了說明這一點,請考慮以下數據:

INSERT INTO myObj (fk_ParentID) VALUES (NULL);
INSERT INTO myObj (fk_ParentID) VALUES (1);
INSERT INTO myObj (fk_ParentID) VALUES (2);
INSERT INTO myObj (fk_ParentID) VALUES (3);
INSERT INTO myObj (fk_ParentID) VALUES (4);
INSERT INTO myObj (fk_ParentID) VALUES (5);
INSERT INTO myObj (fk_ParentID) VALUES (6);
INSERT INTO myObj (fk_ParentID) VALUES (7);

看起來像:

樣本數據

如果我可以ON DELETE CASCADE在此表上定義操作,則執行以下程式碼將刪除表中的所有行:

DELETE FROM myObj WHERE ID = 1;

刪除 ID=1 的行將級聯到 fk_ParentID=1 的行,這將級聯刪除到 fk_ParentID 2 等。很可能這不是您想要的效果。

引用自:https://dba.stackexchange.com/questions/27084