当我尝试向我的表添加约束时遇到问题。我得到错误:
在表 ‘Employee’ 上引入 FOREIGN KEY 约束 ‘FK74988DB24B3C886’ 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
我的约束是在一个Code表和一个employee表之间。该Code表包含Id、Name、FriendlyName和Typea Value。有许多引用代码的employee字段,因此可以对每种类型的代码进行引用。
Code
employee
Id
Name
FriendlyName
Type
Value
如果引用的代码被删除,我需要将字段设置为 null。
任何想法我怎么能做到这一点?
SQL Server 对级联路径进行简单计数,而不是尝试确定是否确实存在任何循环,而是假设最坏的情况并拒绝创建引用操作 (CASCADE):您可以而且应该仍然在没有引用操作的情况下创建约束。如果你不能改变你的设计(或者这样做会影响事情),那么你应该考虑使用触发器作为最后的手段。
FWIW 解决级联路径是一个复杂的问题。其他 SQL 产品将简单地忽略该问题并允许您创建循环,在这种情况下,将竞相看哪个将最后覆盖该值,这可能是设计者的无知(例如 ACE/Jet 就是这样做的)。我知道一些 SQL 产品会尝试解决简单的情况。事实仍然存在,SQL Server 甚至没有尝试,通过禁止多个路径来保证它的安全性,至少它告诉你是这样的。
Microsoft 自己建议使用触发器而不是 FK 约束。