两个字段的唯一约束及其相反

时间:2009-09-03 22:31:00

标签: database unique reverse constraints

问题如下,

我的数据库中有一个友谊表,友谊表有两个用户表的外键。

我想在两个外键上设置一个唯一的键,这样我就没有重复了,但是我想要更多,我希望如果用户A添加了用户B,那么B将无法添加A,并且我希望表中只有一行代表A和B之间的友谊。

有没有办法从数据库服务器添加这样的约束?

到目前为止,我在代码中保留了这个约束。

2 个答案:

答案 0 :(得分:2)

是的,您需要添加一个检查您所描述的业务规则的触发器,并在发现冲突时回滚该事务。在不同的数据库中,它的语法可能不同,但在SQL服务器中它将是

  Create Trigger trig_StopRecipFriendships
  for Insert, Update On Friendships
  As
    If Exists (Select * From Friendships F1
                 Join Friendships F2  
                   On F1.UserA = F2.UserB
                      And F1.UserB = F2.UserA)
     Begin
         Rollback Transaction
         Raiserror ('These Users are already friends', 16,1)
     End

答案 1 :(得分:1)

您可以在( LEAST(friend1,friend2), GREATEST(friend1,friend2) )上添加唯一约束。确切的措辞可能取决于所使用的RDBMS