2015-04-05 119 views
1

我有一个朋友表,有'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),因为这是相同的关系。

+1

最简单的方法:在插入之前,总是对您的关系对进行排序:'(22,45) - >(22,45); (45,22) - >(22,45);'并在两列中保持唯一的键约束。 – dognose 2015-04-05 11:06:44

+0

@satishrajak你没有读过这个问题,是吗? – dognose 2015-04-05 11:07:47

+0

您可以添加一个插入前触发器来检查密钥的朋友列,并在关系已存在的情况下中止插入。但是,您想要设置此代码的方式我可以称呼您为我的朋友,并且您可能不同意。所以你的第二次插入(45,22)更多的是这种友谊的确认,你似乎只想跳过。 – 2015-04-06 02:39:52

回答

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)