Sql server 同一个表上的两个外键:如何实现删除级联?
我有一个有两列的表。每个表都是同一第二个表的外键:Sql server 同一个表上的两个外键:如何实现删除级联?,sql-server,foreign-keys,ddl,Sql Server,Foreign Keys,Ddl,我有一个有两列的表。每个表都是同一第二个表的外键: 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) ) 但是现在我不能再从另一个表中删除实体了: DELETE语句与引用约束“FK__TBL_ASD__
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)
)
但是现在我不能再从另一个表中删除实体了:
DELETE语句与引用约束“FK__TBL_ASD__4DE98D56”冲突
我的问题是:在一起执行TBL_
时,在DELETE CASCADE上执行的最佳解决方案是什么
我试图在外键上的DELETE SET NULL上添加,或在DELETE CASCADE上添加,但由于循环或多个级联路径,无法工作
我已尝试在TBL\u ANOTEHR\u表
上添加删除触发器,但它仍然与外键冲突:
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
我尝试了一个而不是DELETE
-触发器,但是这种方法也不起作用,因为引用的表还包含一个带有级联约束的外键
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
错误:
无法在表“TBL\U另一个表”上更改而不是删除或更新触发器“REMOVE\u FORENGKEY”。这是因为表有一个带有级联删除或更新的外键
使用此触发器:
此触发器的作用不是删除。因此,必须在将引用设置为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
SQL Server仅支持单个级联。如果两者都很重要,您需要以不同的方式来处理此问题,例如使用级联
,而不是触发器,或者强制用户使用SP来完成删除,它优雅地处理delete语句。如果要在instead of触发器中管理delete,则应从外键中删除级联。我不想从引用的TBL_另一个_表中删除级联,因为它也会在级联时被自动删除。但是您正在尝试用instead of触发器处理级联部分。你不能两者都做。这就是错误消息明确告诉您的。如果要使用级联
,则必须选择一个键来处理级联,然后不允许用户删除会影响其他“树”的行;可能会使键上的级联点无效。如果你想使用而不是触发器,那么就像@SeanLange所说的,你必须对所有事情使用触发器;你不能混合这两种溶液。如果您可以控制用户,那么我个人会选择SP路由,但如果不是这样,则使用instead of触发器。