我有一个有两列的表。它们中的每一个都是同一个第二个表的外键:
CREATE TABLE [dbo].[TBL_TOGETHER]
(
[ID1] [int] NULL FOREIGN KEY REFERENCES [TBL_ANOTHER_TABLE](ID),
[ID2] [int] NULL FOREIGN KEY REFERENCES [TBL_ANOTHER_TABLE](ID)
)
Run Code Online (Sandbox Code Playgroud)
但现在我不能再删除实体TBL_ANOTHER_TABLE了:
DELETE 语句与 REFERENCE 约束“FK__TBL_ASD__4DE98D56”冲突。
我的问题是:什么是实现最佳的解决方案ON DELETE CASCADE在TBL_TOGETHER?
我尝试在外键上添加ON DELETE SET NULL或ON DELETE CASCADE,但由于循环或多个级联路径,它不起作用。
我试图在 上添加删除触发器TBL_ANOTEHR_TABLE,但它仍然与外键冲突:
ALTER TRIGGER REMOVE_FORENGKEY
ON TBL_ANOTHER_TABLE
FOR DELETE
AS
BEGIN
UPDATE TBL_TOGETHER
SET TBL_TOGETHER.ID1 = NULL
FROM TBL_TOGETHER
JOIN deleted ON TBL_TOGETHER.ID1 = deleted.ID;
UPDATE TBL_TOGETHER
SET TBL_TOGETHER.ID2 = NULL
FROM TBL_TOGETHER
JOIN deleted ON TBL_TOGETHER.ID2 = deleted.ID;
END
Run Code Online (Sandbox Code Playgroud)
我尝试了INSTEAD OF DELETE-trigger 但这种方法也不起作用,因为引用的表还包含一个带有级联约束的外键。
ALTER TRIGGER REMOVE_FORENGKEY
ON TBL_ANOTHER_TABLE
INSTEAD OF DELETE
AS
BEGIN
UPDATE TBL_TOGETHER
SET TBL_TOGETHER.ID1 = NULL
FROM TBL_TOGETHER
JOIN deleted ON TBL_TOGETHER.ID1 = deleted.ID;
UPDATE TBL_TOGETHER
SET TBL_TOGETHER.ID2 = NULL
FROM TBL_TOGETHER
JOIN deleted ON TBL_TOGETHER.ID2 = deleted.ID;
DELETE TBL_ANOTHER_TABLE
FROM TBL_ANOTHER_TABLE
JOIN deleted ON TBL_ANOTHER_TABLE.ID = deleted.ID
WHERE TBL_ANOTHER_TABLE.ID = deleted.ID;
END
Run Code Online (Sandbox Code Playgroud)
错误:
无法更改表“TBL_ANOTHER_TABLE”上的 INSTEAD OF DELETE 或 INSTEAD OF UPDATE TRIGGER 'REMOVE_FORENGKEY'。这是因为该表有一个带有级联 DELETE 或 UPDATE 的 FOREIGN KEY。
使用此触发器:此触发器起作用而不是删除。因此,您必须在将引用设置为 null 后删除记录。
CREATE TRIGGER Trigger_TBL_ANOTHER_TABLE
ON [dbo].[TBL_ANOTHER_TABLE]
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON;
UPDATE t
SET t.ID1 = NULL
from [dbo].[TBL_TOGETHER] t inner join
deleted d on d.ID = t.ID1
UPDATE t
SET t.ID2 = NULL
from [dbo].[TBL_TOGETHER] t inner join
deleted d on d.ID = t.ID2
DELETE t
from [dbo].[TBL_ANOTHER_TABLE] t inner join
deleted d on d.ID = t.ID
END
GO
Run Code Online (Sandbox Code Playgroud)