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触发器。