我有这个表
id follow_id follower_id
1 | 2 | 3
2 | 2 | 4
3 | 2 | 5
4 | 2 | 6
5 | 3 | 7
6 | 3 | 8
我想跳过如果我试图插入"couple"follow_id 2,follower_id 3而不进行性能的子查询
我能插入吗。。。关于重复密钥更新或类似的内容?
更新,适用于symfony用户
在回答之后。我使用Symfony,做
UNIQUE INDEX followee_and_follower (follow_id,follower);
http://docs.doctrine-project.org/en/2.0.x/reference/annotations-reference.html#uniqueconstraint
这方面的官方语法是
INSERT IGNORE ...
然而,在您的情况下,实际上可能更可取的做法是进行
INSERT ... ON DUPLICATE KEY UPDATE id=id
请参阅基准。根据我的经验,只有当你有一个主键时,这种破解才能提高性能——如果你使用follower_id = follower_id
,优化器就不会识别no-op。
我相信您想要的语法是INSERT IGNORE
。
来自手册:
如果使用IGNORE关键字,则在执行INSERT语句被忽略。例如,如果没有IGNORE重复表中现有的UNIQUE索引或PRIMARY KEY值导致重复键错误,该语句被中止。具有忽略,行仍然没有插入,但没有发生错误。已忽略错误可能会生成警告,尽管重复的密钥错误会不
这需要在(follow_id,follower_id)上有一个唯一的索引,因此如果它还不存在,则需要添加它:
ALTER TABLE mytable
ADD UNIQUE INDEX followee_and_follower (follow_id,follower);