Sql-Server
無法將自引用外鍵關係的刪除規則更改為級聯刪除
我有下表
[dbo].[myObj] ( [ID] [int] IDENTITY(1,1) NOT NULL, [fk_ParentID] [int] NULL )
和我的關係從
fk_ParentID
到ID
。我想在“外鍵關係”視窗->插入和更新規範->刪除規則下將 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 等。很可能這不是您想要的效果。