如果select为null,则插入MySQL以避免双向重复

我build立一个数据库,以保持我的应用程序的用户之间的友谊。
我用来与MySQL实例通信的服务器是使用Node.js(Express)编写的。

我的表“友谊”主要由两个INT组成,这两个INT对应于(外键)到用户ID。 我想避免双向重复(1,2对2,1),所以我需要写一个查询,它会做到以下几点:

INSERT INTO friendships f (id_1, id_2) VALUES (?, ?) IF (SELECT * FROM friendships s WHERE s.id_1=? AND s.id_2=?) IS NULL ; 

显然这个不是真的有用。 当然,如果最后两个问号与第一个问号相比,我们会得到相反的值,并在id(id_1,id_2)上使用UNIQUE键。

这类问题的通常答案是“只需按大小排列你的ID以避免重复”,这是一个很好的答案。 但在我的情况下,我想logging谁发送的朋友请求(和谁批准),而不使用任何额外的variables(和额外的查询)。

另外,我不想为此使用代码,以避免“并发”问题。

谢谢!

在MySQL中,您可以使用执行检查的触发器来执行此操作。 其他一些数据库具有function索引,计算列上的索引或检查约束来帮助实现此function。

如果您想要在insert进行检查,您可以执行:

 INSERT INTO friendships(id_1, id_2) select new1, new2 from (select ? as new1, ? as new2) t where not exists (select 1 from friendships f where f.id_1 = new2 and f.id_2 = new1 ); 

你也应该在id_1id_2上有一个唯一的索引:

 create unique index idx_friendsships_id1_id2 on (id_1, id_2); 

编辑:

基本的查询是:

 INSERT INTO friendships(id_1, id_2) select ?, ? from dual where not exists (select 1 from friendships f where f.id_1 = ? and f.id_2 = ? ); 

但是你必须以正确的顺序得到参数,所以早期的方法不容易出错。