避免重复在mysql插入
问题描述:
我有一个朋友表,有'ID','朋友(INTEGER)'和'用户(INTEGER)'字段。避免重复在mysql插入
用户和朋友之间存在朋友关系。 即
id user friend
6 22 45
7 45 22
是同一个朋友关系,应该被视为重复记录。
我要输入一大堆的一次记录,所以是这样的:
INSERT INTO friends (user, friend) VALUES(22, 34), (22, 76), (22, 567)...;
在这种情况下,我可以轻松地使用忽略以避免进入重复(22,34)项(如果( 22,34)已经存在),但是如果(34,22)已经存在,是否有办法避免输入(22,34),因为这是相同的关系。
答
对每一对进行排序;然后执行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)
最简单的方法:在插入之前,总是对您的关系对进行排序:'(22,45) - >(22,45); (45,22) - >(22,45);'并在两列中保持唯一的键约束。 – dognose 2015-04-05 11:06:44
@satishrajak你没有读过这个问题,是吗? – dognose 2015-04-05 11:07:47
您可以添加一个插入前触发器来检查密钥的朋友列,并在关系已存在的情况下中止插入。但是,您想要设置此代码的方式我可以称呼您为我的朋友,并且您可能不同意。所以你的第二次插入(45,22)更多的是这种友谊的确认,你似乎只想跳过。 – 2015-04-06 02:39:52