我有一个朋友表,其中包含' id'朋友(INTEGER)'和'用户(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)已经存在,因为这是相同的关系。
答案 0 :(得分:1)
对每对进行排序;然后执行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)