同一个表上的两个外键:如何在删除级联上实现?

5 sql-server ddl foreign-keys

我有一个有两列的表。它们中的每一个都是同一个第二个表的外键:

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 CASCADETBL_TOGETHER

我尝试在外键上添加ON DELETE SET NULLON 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。

Afs*_*idi 0

使用此触发器:此触发器起作用而不是删除。因此,您必须在将引用设置为 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)