这是我的表:
表名:UserLinks
Link_ID User_1 User_2
1 234325 100982
2 116727 299011
3 399082 197983
4 664323 272351
基本上,在此表中,重复值为:
Link_ID User_1 User_2
1 232 109
2 109 232
我环顾四周,发现我应该使用INSERT IGNORE来防止重复条目,但我不知道如何编写一个认为User_1和User_2之间的关系与User_2和User_1之间的关系相同的查询。
非常感谢任何建议/帮助。
答案 0 :(得分:1)
这有点令人讨厌,两个字段之间的交换关系,但是一个独特的索引无法帮助,因为这些值可以是两种方式。
如果您可以更改代码/数据以确保id的较低值始终放在user_1字段中,那么至少会让唯一索引起作用 - 但它有点讨厌。
或者,如果基于(例如,一次不是一行而是一组行)设置插入,则可以基于两种方式加入现有数据和反连接。 :
(existing.user_1 = new.user_1 and existing.user_2 = new user_2)
OR (existing.user_1 = new.user_2 and existing.user_2 = new user_1)
并在where子句中检查以确保没有匹配(连接的反部分)
where existing.link_id is null
虽然这对于一次插入的行来说效率不高。
答案 1 :(得分:0)
您需要多准确一些。您可以创建一个唯一索引(或主键),它是两个xor'd一起的哈希值。
类似主键(md5(user_1)xor md5(user_2))。
因为“md5(232)xor md5(109)”总是等于“md5(109)xor md5(232)”。无论订单如何都可以。
如果您有大量记录(如数百万或数十亿),这将有很小的碰撞机会,但除此之外,它应该有效。
你可能需要检查sql,因为我没有测试SQL是否允许像这样生成主键。
这样,您无需在插入或更新时添加任何额外的检查,因为唯一的constrant会为您进行检查。