如果不存在Mysql,则插入[重复]
Posted
技术标签:
【中文标题】如果不存在Mysql,则插入[重复]【英文标题】:INSERT if not Exist Mysql [duplicate] 【发布时间】:2013-12-22 13:23:36 【问题描述】:我有这张桌子
id follow_id follower_id
1 | 2 | 3
2 | 2 | 4
3 | 2 | 5
4 | 2 | 6
5 | 3 | 7
6 | 3 | 8
如果我尝试插入“情侣”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
【问题讨论】:
【参考方案1】:我相信你想要的语法是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);
【讨论】:
我尝试 INSERT IGNORE INTO mytable (follow_id, follower_id) VALUES (2,3),但添加一行新 id 和 follow_id 2 follower_id 3 您需要一个关于 (follow_id,follower_id) 的唯一索引。请在上面查看我的更新答案。【参考方案2】:这个的官方语法是
INSERT IGNORE ...
但是,在您的情况下,实际上可能更可取
INSERT ... ON DUPLICATE KEY UPDATE id=id
见benchmarks。根据我的经验,只有在你有主键的情况下,这种 hack 才能提高性能——如果你这样做 follower_id = follower_id
,优化器将无法识别空操作。
【讨论】:
以上是关于如果不存在Mysql,则插入[重复]的主要内容,如果未能解决你的问题,请参考以下文章