尝试向表中添加约束时出现问题。我得到了错误:
在表“ Employee”上引入FOREIGN KEY约束“ FK74988DB24B3C886”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
我的约束是在一个Code表和一个employee表之间。该Code表包括Id,Name,FriendlyName,Type和Value。的employee具有多个字段的标号,从而可以存在对于每种类型的码的参考的。
Code
employee
Id
Name
FriendlyName
Type
Value
如果删除了所引用的代码,则需要将字段设置为null。
有什么想法可以做到这一点吗?
SQLServer会简单地计算级联路径,而不是尝试找出是否确实存在任何循环,而是假定最坏的情况并拒绝创建引用动作(CASCADE):您可以并且应该仍然创建没有引用动作的约束。如果您不能更改设计(或这样做会损害性能),那么您应该考虑使用触发器作为最后的选择。
FWIW解决级联路径是一个复杂的问题。其他SQL产品将简单地忽略该问题,并允许您创建周期,在这种情况下,人们将竞相竞猜哪个周期最后会覆盖值,这可能是设计者的无知(例如ACE / Jet这样做)。我了解某些SQL产品将尝试解决简单的情况。事实仍然存在,SQL Server甚至没有尝试,通过禁止多个路径来发挥它的超安全性,至少它告诉您了这一点。
Microsoft本身建议使用触发器而不是FK约束。