INSERT如果不存在Mysql

时间:2013-12-05 14:37:17

标签: mysql sql

我有这张桌子

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而不执行子查询的性能

我可以执行INSERT ... ON DUPLICATE KEY UPDATE或其他内容吗?

更新,适用于symfony用户

答案后。我使用Symfony,并做了

UNIQUE INDEX followee_and_follower (follow_id,follower);

http://docs.doctrine-project.org/en/2.0.x/reference/annotations-reference.html#uniqueconstraint

2 个答案:

答案 0 :(得分:4)

我相信您想要的语法是INSERT IGNORE

来自the manual

  

如果使用IGNORE关键字,则执行时会出现错误   INSERT语句被忽略。例如,没有IGNORE,就是一行   复制表中的现有UNIQUE索引或PRIMARY KEY值   导致重复键错误,语句被中止。同   IGNORE,仍然没有插入行,但没有发生错误。忽视   错误可能会产生警告,尽管重复键错误会产生警告   不

这需要一个唯一的索引(follow_id,follower_id),所以如果它不存在,你需要添加它:

ALTER TABLE mytable
  ADD UNIQUE INDEX followee_and_follower (follow_id,follower);

答案 1 :(得分:4)

这方面的官方语法是

INSERT IGNORE ...

但是,在你的情况下,实际上可能更喜欢

INSERT ... ON DUPLICATE KEY UPDATE id=id

benchmarks。根据我的经验,如果你有一个主键,这个hack只会提高性能 - 如果你follower_id = follower_id,优化器将无法识别no-op。