- 使用 insert ignore
- 使用 replace
- 使用 insert … on duplicate key update
Using INSERT IGNORE
INSERT IGNORE mysql会忽略insert的执行的错误。一位着当UNIQUE index 或者 Primary key 重复时,mysql会忽略这个错误,并且忽略这个插入命令。适用于 执行大批量插入不确定是否存在于数据库的数据。这个命令不会造成id不连续。
> select max(id) from huge_coupon_product limit 1;
3203
> insert ignore into huge_coupon_product (item_id) values (18146518); # duplicate
No errors; 0 raws affected
> select max(id) from huge_coupon_product limit 1;
3203
总结:不会新增id,直接忽略整条命令
Using REPLACE
- 找不到具有匹配值的现有数据行,因此执行标准INSERT语句。
- 找到匹配的数据行,导致使用标准DELETE语句删除现有行,然后执行正常的INSERT。
这个命令感觉比较神奇哈,有两种可能的行为,不存在插入,存在删除已存在后再进行插入。
> select max(id) from huge_coupon_product limit 1;
3203
> replace into huge_coupon_product (item_id) values (18146518);
No errors; 2 raws affected
> select max(id) from huge_coupon_product limit 1;
3204
总结: 会增加id,会有两行被操作,先删除,后插入
Using INSERT ... ON DUPLICATE KEY UPDATE
不存在插入,存在更新
> select max(id) from huge_coupon_product limit 1;
3204
> insert into huge_coupon_product (item_id) values (18146518) ON DUPLICATE KEY UPDATE item_id=111;
No errors; 2 raws affected
> select max(id) from huge_coupon_product limit 1;
3204
总结: 不会新增id,可以upsert。
新问题:
为啥affected两行呢?并且没有新增id的情况下? 考虑affected的判断条件。
keep moving
More information can be found in the official documentation.
网友评论