问题如下,
我的数据库中有一张友谊表,友谊表有两个用户表的外键。
我想在两个外键上设置一个唯一键,这样我就不会重复了,但是我想要更多,我希望如果用户 A 添加了用户 B,那么 B 将无法添加 A,我想表中只有一行代表 A 和 B 之间的友谊。
有没有办法从数据库服务器添加这样的约束?
到目前为止,我一直在我的代码中保持这个约束。
问题如下,
我的数据库中有一张友谊表,友谊表有两个用户表的外键。
我想在两个外键上设置一个唯一键,这样我就不会重复了,但是我想要更多,我希望如果用户 A 添加了用户 B,那么 B 将无法添加 A,我想表中只有一行代表 A 和 B 之间的友谊。
有没有办法从数据库服务器添加这样的约束?
到目前为止,我一直在我的代码中保持这个约束。
是的,您需要添加一个触发器来检查您描述的业务规则并在发现冲突时回滚事务。这在不同的数据库中的语法可能不同,但在 SQL Server 中它会是
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
您可以在( LEAST(friend1,friend2), GREATEST(friend1,friend2) )
. 确切的措辞可能取决于RDBMS
所使用的。