考虑两列,如何防止重复值插入mySQL?

时间:2011-10-20 02:08:17

标签: php mysql

这是我的表:

表名: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之间的关系相同的查询。

非常感谢任何建议/帮助。

2 个答案:

答案 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会为您进行检查。