【问题标题】:SQL Server Multiple Cascade Path Solved with adding independent primary keySQL Server 多级联路径通过添加独立主键解决
【发布时间】:2019-10-21 05:04:26
【问题描述】:

我在这里查看了几篇关于 SQL Server 错误 1785 的堆栈溢出的帖子:引入 FOREIGN KEY 约束可能会导致循环或多个级联路径。而且我发现不检查周期是 Microsoft 产品的一项功能,常见的建议是使用触发器绕过它。

所以我的问题是:

如何在 SQL Server 中的多个表上生成外键依赖关系?

错误地,我发现如果我创建一个单独的独立 PRIMARY KEY,我可以创建具有多个级联路径的表而不会出现错误(并且它在功能上按预期工作)。作为参考,我正在运行 SQL Server 2019。

以下会产生错误:

CREATE TABLE t1 (
    id bigint,
    CONSTRAINT PK_t1 PRIMARY KEY CLUSTERED (id)
);

CREATE TABLE t2 (
    id bigint,
    CONSTRAINT PK_t2 PRIMARY KEY CLUSTERED (id)
);

CREATE TABLE cross_t1_t2 (
    t1_id bigint,
    t2_id bigint,
    CONSTRAINT PK_cross_t1_t2 PRIMARY KEY CLUSTERED (t1_id,t2_id),
    CONSTRAINT FK_cross_t1_t2_t1 FOREIGN KEY (t1_id)     
        REFERENCES customers (id)     
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT FK_cross_t1_t2_t2 FOREIGN KEY (t2_id)     
        REFERENCES addresses (id)     
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

因为我在任何地方都找不到这个答案,所以我在这里发布它作为触发器解决方法的替代方案。很高兴知道为什么会这样。

【问题讨论】:

    标签: sql sql-server sql-server-2019


    【解决方案1】:

    为了解决多级联路径错误,您可以创建一个触发器来检查和删除记录,如提到的here

    或者您可以创建一个单独的列作为主键(可以自动递增IDENTITY

    以下不会产生错误:

    CREATE TABLE t3 (
        id bigint,
        CONSTRAINT PK_t3 PRIMARY KEY CLUSTERED (id)
    )
    
    CREATE TABLE t4 (
        id bigint,   
        CONSTRAINT PK_t4 PRIMARY KEY CLUSTERED (id)
    );
    CREATE TABLE cross_t3_t4 (
        id      bigint,-- THE ONLY DIFFERENCE IS THE CREATION OF A SEPARATE PK                  
        t3_id   bigint,
        t4_id   bigint,
        --Constraints   
        CONSTRAINT PK_cross_t3_t4 PRIMARY KEY CLUSTERED (id),
        CONSTRAINT FK_cross_t3_t4_t3 FOREIGN KEY (t3_id)     
            REFERENCES t3 (id)     
            ON DELETE CASCADE    
            ON UPDATE CASCADE,
        CONSTRAINT FK_cross_t3_t4_t4 FOREIGN KEY (t4_id)     
            REFERENCES t4 (id)     
            ON DELETE CASCADE    
            ON UPDATE CASCADE
    );
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2017-02-09
      • 2021-01-12
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多