我在向SQL Server中的外键添加级联删除时遇到问题。表A有三列。表A中的第1列和第2列是表B中同一列的外键查找。我希望删除表B中的行,以根据这些外键在表A上的行上级联删除。
表A中的另一列具有对表C的外键查找。如果删除了表C中的行,那么我希望在表A中将相应的单元格设置为null。
当我添加这些约束时,我抛出了错误:
介绍FOREIGN KEY约束' FK_RDU_TODELIVERABLEUNITREF'在桌子上' RelatedDeliverableUnit'可能会导致循环或多个级联路径。指定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"/>
提前感谢您提供任何帮助
答案 0 :(得分:2)
我找不到更新版本的相应文档,但SQL Server 2000 BOL解决了这个问题:
由单个DELETE或UPDATE触发的一系列级联引用操作必须形成一个不包含循环引用的树。在DELETE或UPDATE产生的所有级联引用操作的列表中,任何表都不能出现多次。级联引用操作树不得包含任何给定表的多个路径。树的任何分支在遇到已指定NO ACTION或默认值的表时终止。
后来的版本没有改变这个。你犯了这个错误:
级联引用操作树不得包含任何给定表的多个路径
我知道实现此目的的唯一方法是使用INSTEAD OF
触发器实现B和A之间的级联之一,而不是使用ON DELETE...
。
表A和表C之间的关系不应受任何影响。
(2008 BOL)