以下是方案
Table1
(Id, Name
)
Table2
(Id, Name1, Name2, Type
)
FK1
:Name1
使用Table1.Name
On delete cascade
FK2
:Name2
使用Table1.Name
On delete cascade
FK2
抛出以下错误
ERROR:
在表Table2上引入FOREIGN KEY约束FK2可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
但是,在我的方案中,删除了Name1
或Name2
的实体是否应删除Table2
中的相应条目。
请帮助我了解这可能导致的问题是什么?
答案 0 :(得分:2)
FK2不会导致循环,但会导致多个级联路径。从Table2中删除的记录将导致Table1中的行被删除两次,每次删除标记为级联的外键。这是设计不允许的。您提出的问题已经回答here
“由单个DELETE或UPDATE触发的一系列级联引用操作必须形成一个不包含循环引用的树。在表的所有级联引用操作的列表中,任何表都不会出现多次DELETE或UPDATE。此外,级联引用操作树不得有任何指定表的多个路径。树的任何分支在遇到已指定NO ACTION的表时结束,或者是默认。”取自MSDN Library