【问题标题】:SQL Server Foreign Key cause cycles or multiple cascade pathsSQL Server 外键导致循环或多个级联路径
【发布时间】:2019-02-19 20:35:11
【问题描述】:

在 SQL Server 的外键上添加级联删除时遇到问题。表 A 有三列。表 A 中的第 1 列和第 2 列是对表 B 中同一列的外键查找。我希望删除表 B 中的一行,以便根据这些外键对表 A 上的一行进行删除。

表 A 中的另一列对表 C 有外键查找。如果表 C 中的一行被删除,那么我希望将表 A 中的相应单元格设置为空。

当我添加这些约束时,我会抛出错误:

在表“RelatedDeliverableUnit”上引入 FOREIGN KEY 约束“FK_RDU_TODELIVERABLEUNITREF”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

我对此有点坚持,Oracle 似乎对这个逻辑非常满意。我正在使用 Liquibase 添加这些约束。我认为错误取决于我的逻辑而不是语法,但为了完整起见,这里是管理外键的 Liquidbase 脚本:

    <addForeignKeyConstraint constraintName="FK_RDU_FROMDELIVERABLEUNITREF" baseTableName="relatedDeliverableUnit"
                             baseColumnNames="FROMDELIVERABLEUNITREF" referencedTableName="DELIVERABLEUNIT" referencedColumnNames="DELIVERABLEUNITREF" onDelete="CASCADE"/>

    <addForeignKeyConstraint constraintName="FK_RDU_TODELIVERABLEUNITREF" baseTableName="relatedDeliverableUnit"
                             baseColumnNames="TODELIVERABLEUNITREF" referencedTableName="DELIVERABLEUNIT" referencedColumnNames="DELIVERABLEUNITREF" onDelete="CASCADE"/>                        

    <addForeignKeyConstraint constraintName="FK_RDU_RELATIONSHIPREF"
                             baseTableName="relatedDeliverableUnit" baseColumnNames="RELATIONSHIPREF" referencedTableName="RELATIONSHIPTYPES" referencedColumnNames="RELATIONSHIPREF" onDelete="SET NULL"/>                      

提前感谢您的帮助

【问题讨论】:

    标签: sql-server liquibase


    【解决方案1】:

    我找不到更高版本的相应文档,但SQL Server 2000 BOL 解决了这个问题:

    由单个 DELETE 或 UPDATE 触发的一系列级联引用操作必须形成不包含循环引用的树。在由 DELETE 或 UPDATE 产生的所有级联引用操作的列表中,任何表都不能出现多次。级联引用操作的树不能有多个到任何给定表的路径。树的任何分支在遇到未指定 NO ACTION 或为默认值的表时都会终止。

    以后的版本并没有改变这一点。你犯了这个错误:

    级联引用操作树不能有多个路径到任何给定表

    我知道的唯一方法是使用 INSTEAD OF 触发器而不是使用 ON DELETE... 来实现 B 和 A 之间的级联之一。

    表 A 和 C 之间的关系不应受到任何影响。


    (2008 BOL)

    【讨论】:

    • 感谢您的建议。我还想知道添加这是一个外键,其中两列查找相同的引用列,但我也不确定是否允许。我猜我得看看触发器!
    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 2010-10-25
    • 2012-09-21
    • 2013-03-26
    相关资源
    最近更新 更多