同一个 table 上的两个外键:删除级联如何实现?
Two foreign keys on same table: how to implement on delete cascade?
我有一个包含两列的 table。他们每个人都是同一秒的外键 table:
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)
)
但现在我不能再从 TBL_ANOTHER_TABLE
中删除实体了:
The DELETE statement conflicted with the REFERENCE constraint "FK__TBL_ASD__4DE98D56".
我的问题是:在 TBL_TOGETHER
实施 ON DELETE CASCADE
的最佳解决方案是什么?
我尝试在外键上添加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
我试过 INSTEAD OF DELETE
触发器,但这种方法也不起作用,因为引用的 table 还包含一个具有级联约束的外键。
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
错误:
Cannot alter INSTEAD OF DELETE or INSTEAD OF UPDATE TRIGGER 'REMOVE_FORENGKEY' on table 'TBL_ANOTHER_TABLE '. This is because the table has a FOREIGN KEY with cascading DELETE or UPDATE.
使用这个触发器:
此触发器起作用而不是删除。因此您必须在将引用设置为空后删除记录。
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
我有一个包含两列的 table。他们每个人都是同一秒的外键 table:
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)
)
但现在我不能再从 TBL_ANOTHER_TABLE
中删除实体了:
The DELETE statement conflicted with the REFERENCE constraint "FK__TBL_ASD__4DE98D56".
我的问题是:在 TBL_TOGETHER
实施 ON DELETE CASCADE
的最佳解决方案是什么?
我尝试在外键上添加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
我试过 INSTEAD OF DELETE
触发器,但这种方法也不起作用,因为引用的 table 还包含一个具有级联约束的外键。
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
错误:
Cannot alter INSTEAD OF DELETE or INSTEAD OF UPDATE TRIGGER 'REMOVE_FORENGKEY' on table 'TBL_ANOTHER_TABLE '. This is because the table has a FOREIGN KEY with cascading DELETE or UPDATE.
使用这个触发器: 此触发器起作用而不是删除。因此您必须在将引用设置为空后删除记录。
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