对两列值组合的唯一约束

h7appiyu  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(337)

我不知道该怎么回答这个问题,所以如果听起来很奇怪的话,我很抱歉。
我的数据库中有一个表叫做 friendRequests 包含以下列: id , sender_id , recipient_id ,和 status . 如何确保其他行没有重复 recipient_id 以及 sender_id 价值观?
例如,如果表中有一行具有以下值: (1, 4, 6, 0) ,如何确保其他行没有 sender_id 4和a的 recipient_id 其他行都没有 sender_id 六加一 recipient_id 四分之一?

ogsagwnx

ogsagwnx1#

我所听到的是,如果用户a邀请用户b,你不想为用户b创建一个新的记录来邀请用户a。
我认为不可能强制这样的约束,除非可能通过使用触发器,我可能不建议这样做。我建议您在应用程序中尝试并强制执行此操作。

aiazj4mn

aiazj4mn2#

必须在表上创建唯一索引。

create unique index sender_recipient
on friendRequest (sender_id, récipient_id)
bcs8qyzn

bcs8qyzn3#

为了 same relations -在上使用唯一约束 <sender, receiver> .
逆关系 <receiver, sender> 但是,这是可能的,因为唯一键约束的ID不同。
要处理这个问题(使用uniqe键约束),必须添加另一列,我们称之为 friendship -在这里,您将添加一个唯一键约束,并插入用户ID,这些ID是串联的,但顺序如下:
i、 e.如果用户 3 向发送好友请求 10 ,您将插入 3-10 转到那个专栏。如果邀请来自 103 ,您将添加 3-10 也。
这样,你就可以知道是谁发起了友谊( sender_column=3 , receiver-column=10 )但同时也要确保没有倒退( friendship=3-10 已存在)
所以有点像

INSERT INTO friendships(sender, receiver, friendship) VALUES(3,10,"3-10");
or vice versa:
INSERT INTO friendships(sender, receiver, friendship) VALUES(10,3,"3-10");

如果已经请求了友谊,这两个约束中的一个将避免插入(实际上,第二个约束对任何情况都是足够的,前两列只允许确定友谊的主动和被动部分。)

相关问题