mysql批量插入并忽略重复的数据
前言
最近,小编在公司遇到这样一个需求,需要对新增的数据,批量插入到数据库表中,同时当插入的数据与表中数据重复了,那么保留原有的数据。针对这个需求,小编想到了如下三个语句:
INSERT IGNORE INTO
INSERT ... ON DUPLICATE KEY UPDATE
REPLACE INTO
接下来,我们来看下这个三个语句的区别:
1、REPLACE INTO
按照单词的意思是替换插入,也算是见文知意了。它的原理是,当发现新插入的数据与现有记录重复时,它会先删除现有记录,并插入新记录,如果记录是自增主键,它会新生成自增主键的值,插入新的记录,也就说说,它会保留新插入的数据,同时会有删除和插入两个操作。
2、INSERT … ON DUPLICATE KEY UPDATE
这个语句的意思是,当发现新插入的数据,与数据表中的数据重复时,按照某些字段进行更新,没有重复则直接更新。这个语句的好处是,我们不用进行两次操作,先进行查询有没有,然后再有的时候进行更新这样两步来操作。它一步就完成了。也是符合我们开头说的需求的,但是,它不支持批量插入。INSERT INTO ... VALUES ..., ... ON DUPLICATE KEY UPDATE
这种语法是不支持的.
如果是单条插入,这个是可以使用的。当不想要更新任何字段时,也可以在语句中使用
ON DUPLICATE KEY UPDATE DO NOTHING
。从 MySQL 8.0.21 开始,ON DUPLICATE KEY UPDATE 支持 DO NOTHING 语法。
3、INSERT IGNORE INTO
插入数据时,在遇到主键或唯一索引冲突时忽略该插入操作,也就是数据保留了原有数据表的记录。
似乎,这个很符合要求,但是使用时需要注意,它除了忽略主键和唯一索引冲突,还会忽略其他类型的错误,比如说,违反外键约束、数据类型不匹配、字段值超出范围等。
总结
最后,小编使用了INSERT IGNORE INTO语句,这样在批量处理的时候,也是可以排重的,现在设计表都是不假外键的,数据类型不一样时mybatis也会做转换,字段值超出范围的数据作为不合规范的数据直接忽略了。后边,在进一步分析一下三个语句在执行过程中的枷锁情况。