我有一个Person
表和Stuff
表。Stuff
可以属于一个人,其他人(而不是所有者)也可以使用这些东西。
设计如下:
个人
- Id
- 名称
填充
- Id
- 名称
- OwnerId(非必需)
- UserId(非必需)
现在更改表格以建立关联:
alter table [stuff]
add constraint Stuff2PersonOwner
foreign key (PersonId)
references [person] (id) ON DELETE SET NULL;
上面的脚本执行得很好。
alter table [stuff]
add constraint Stuff2PersonUser
foreign key (UserId)
references [person] (id) ON DELETE SET NULL;
当我执行上面的脚本时,我得到一个异常:
在表"Stuff"上引入FOREIGN KEY约束"Stuff2PersonUser"可能导致循环或多个级联路径。指定ON DELETE NOACTION或ON UPDATE NO ACTION,或修改其他外键约束。
这里有什么问题?为什么我不能创建与ON DELETE SET NULL
的第二个关联?
外键的文档指定了以下限制:
由单个DELETE或UPDATE必须形成不包含循环的树参考文献。任何表都不能在所有表的列表中出现一次以上DELETE或UPDATE导致的级联引用操作。此外,级联引用操作的树不能有更多指向任何指定表的多个路径树的任何分支都结束了当遇到未指定ACTION的表时,或者是默认值。
突出显示的句子描述了正在发生的事情。当删除一个Person
时,两个潜在路径将到达Stuff
——每列一个。因此,SQL Server不允许使用此选项建立第二个外键关系。