从同一个表的2列到同一主键的外键

时间:2016-04-27 10:37:46

标签: sql-server foreign-key-relationship

我有两张桌子:

用户

id  |  username
--------------
 1  |  James
 2  |  John
 3  |  Jack
 4  |  Jim
 5  |  Jane
 6  |  Jessica

大三

senior_id  |  junior_id
-----------------------
 1         |  4
 1         |  6
 2         |  3
 4         |  5

senior_idjunior_id都引用了users表的id列。

如何设置以便a)保证senior_idjunior_id都存在于users和b)delete来自users会从juniors级联并删除已删除ID的所有实例,无论是senior_id还是junior_id?即在上面的示例中删除Jim将自动从青少年中删除第一个和最后一个记录。

我尝试用两个单独的约束来做这件事。但是如果我在两个约束条件下设置级联,我会得到一个'可能会导致循环或多个级联路径'错误。

如果我只在一个约束上设置它,那么删除失败(在像Jim这样的情况下)因为它只级联到其中一个列,因此违反了约束。

我必须能够在SQL Server 2005上执行此操作。

1 个答案:

答案 0 :(得分:0)

删除FK约束。对于FK约束检查。在insert / update.if id之前创建表juniors上的触发器,然后rollback.Again现在在表上创建另一个触发器User for DELETE.and在trigger write script中删除所有记录。因为FK不符合您的要求,因此没有必要保留一个额外的约束。

最重要的是,我认为你的表设计很糟糕。表设计应该像Employee-Manager关系表,即将UserID保存在用户表中。

你的许多问题都会消失。 此表上的任何查询都没有额外的成本或复杂性

id  |  username   SeniorID
--------------
 1  |  James
 2  |  John
 3  |  Jack        2
 4  |  Jim         5 
 5  |  Jane
 6  |  Jessica