我有一个 friend 表,其中包含“id”、“friend (INTEGER)”和“user (INTEGER)”字段。
用户与好友之间存在好友关系。 即
id user friend
6 22 45
7 45 22
是同一个好友关系,应该算是重复记录。
我想一次输入一大堆记录,所以像这样:
INSERT INTO friends (user, friend) VALUES(22, 34), (22, 76), (22, 567)...;
在这种情况下,我可以轻松地使用 IGNORE 来避免输入重复的 (22, 34) 条目(如果 (22, 34) 已经存在),但是有没有一种方法我也可以避免输入 (22, 34) 如果(34, 22) 已经存在,因为这是相同的关系。
最佳答案
对每对进行排序;然后执行 INSERT IGNORE
以避免错误消息。
插入时可以排序
INSERT IGNORE INTO tbl (a,b) VALUES (LEAST($a, $b), GREATEST($a, $b));
但是,为了进行批量插入,您可能应该使用客户端语言进行排序。
另一个问题:INSERT IGNORE
将在检查 dup 之前创建一个 id
。因此,许多 AUTO_INCREMENT
值将被“销毁”。
与其解释如何避免燃烧,不如说id
似乎没有充分的理由。而是有
PRIMARY KEY(user_id, friend_id)
排序的另一个问题......SELECT
可能需要做一个UNION
:
( SELECT ... WHERE user_id = $x )
UNION ALL
( SELECT ... WHERE friend_id = $x )
这意味着您也需要这个:
INDEX(friend_id, user_id)
关于mysql - 避免在 mysql 插入中重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29456570/