小编典典

外键约束可能会导致循环或多个级联路径?

sql

尝试向表中添加约束时出现问题。我得到了错误:

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

我的约束是在一个Code表和一个employee表之间。该Code表包括IdNameFriendlyNameTypeValue。的employee具有多个字段的标号,从而可以存在对于每种类型的码的参考的。

如果删除了所引用的代码,则需要将字段设置为null。

有什么想法可以做到这一点吗?


阅读 205

收藏
2021-05-05

共1个答案

小编典典

SQLServer会简单地计算级联路径,而不是尝试找出是否确实存在任何循环,而是假定最坏的情况并拒绝创建引用动作(CASCADE):您可以并且应该仍然创建没有引用动作的约束。如果您不能更改设计(或这样做会损害性能),那么您应该考虑使用触发器作为最后的选择。

FWIW解决级联路径是一个复杂的问题。其他SQL产品将简单地忽略该问题,并允许您创建周期,在这种情况下,人们将竞相竞猜哪个周期最后会覆盖值,这可能是设计者的无知(例如ACE
/ Jet这样做)。我了解某些SQL产品将尝试解决简单的情况。事实仍然存在,SQL
Server甚至没有尝试,通过禁止多个路径来发挥它的超安全性,至少它告诉您了这一点。

Microsoft本身建议使用触发器而不是FK约束。

2021-05-05