1

我在将级联删除添加到 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"/>                      

提前感谢您的帮助

4

1 回答 1

2

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

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

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

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

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

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


2008 年提单

于 2012-10-08T09:23:46.590 回答