SQL Server:表对另一个表进行两次引用

时间:2015-10-30 10:27:18

标签: sql sql-server associations

我有一个Person表和Stuff表。 Stuff可能属于一个人,而其他人(非所有者)也可以使用这些东西。

这是设计:

  • 编号
  • 名称

东西

  • 编号
  • 名称
  • 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 NO   ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY   约束

这是什么问题?为什么我无法与ON DELETE SET NULL创建第二个关联?

1 个答案:

答案 0 :(得分:1)

外键的documentation指定以下限制:

  

由单个触发的一系列级联参照动作   DELETE或UPDATE必须形成一个不包含循环的树   引用。没有表可以在所有列表中出现多次   由DELETE或UPDATE产生的级联引用操作。   此外,级联引用操作树必须没有更多   而不是指向任何指定表的一条路径。树的任何分支都已结束   当它遇到一个已经指定了NO ACTION的表时   是默认值。

突出显示的句子描述了正在发生的事情。删除Stuff时,两个潜在路径会到达Person - 每列一个。因此,SQL Server不允许使用此选项的第二个外键关系。