SQL Server的外键的原因循环或多个级联路径(SQL Server Foreign Key c

2019-10-17 07:16发布

我在加入级联删除到SQL Server中的外键的问题。 表A有三列。 在表中的列1和2是外键的外观起坐表B.同一列我想删除行的表B级联删除一个基于这些外键的表A中的一行。

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

当我在这些约束添加我抛出的错误:

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

我有点卡住这一点,甲骨文似乎与这个逻辑非常高兴。 我加入使用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"/>                      

在此先感谢您的帮助

Answer 1:

我找不到更高版本的相应的文件,但SQL Server 2000的BOL解决此问题:

由单触发的一系列级联引用操作删除或更新必须形成不包含循环引用的树。 无表可从删除或更新导致的所有级联引用操作的列表中出现不止一次。 级联引用操作树不能有一个以上的路径,任何给定的表。 当它遇到为其NO动作已被指定或是缺省的表树的任何分支被终止。

及更高版本并没有改变这一点。 你落下的这个犯规:

级联引用操作树不能有一个以上的路径,任何给定的表

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

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


( 2008年 )



文章来源: SQL Server Foreign Key cause cycles or multiple cascade paths