当前位置: 首页 > 科技观察

MySQL批量插入,如何不插入重复数据?

时间:2023-03-11 22:54:27 科技观察

温故而知新,看来真的要温故而知新了,一直不用就会忘记。业务很简单:需要批量插入一些数据,数据源可能是其他数据库的表,也可能是外部excel导入。那么问题来了,是不是每次插入前都要检查是否重复,过滤代码中的数据,过滤掉重复的?在大数据数据库中插入一个值时,也需要判断是否重复插入,然后再插入。如何提高效率?看来我不是唯一遇到这个问题的人。解决方案有很多种,不同的场景有不同的解决方案。当数据量小的时候,可以为所欲为,但是当数据量很大的时候,这就不是一个简单的问题了。数以百万计的数据是不可能找出来去重的!说说我在谷歌上找到的解决方案。1.Insertignoreinto插入数据时,如果出现错误,比如重复数据,则不会返回错误,只会以警告的形式返回。所以使用ignore来确保语句本身没有问题,否则会被忽略。比如:INSERTIGNOREINTOuser(name)VALUES('telami')这个方法很简单,但是有可能插入不是因为重复数据报错,而是因为其他原因,同样忽略~2、onduplicatekeyupdate当primary或??unique重复时,执行更新语句。如果update后面跟着一个无用的语句,比如id=id,和1的作用一样,但是不会忽略错误。例如,为了插入重复数据不报错,可以使用如下语句:INSERTINTOuser(name)VALUES('telami')ONduplicateKEYUPDATEidid=id该方法有一个前提条件,即需要插入的约束条件必须是primarykey或者uniqueConstraints(在你的业务中,如果要作为唯一判断,就把那个字段设置为uniqueconstraint,也就是uniquekey)。3.insert...select...wherenotexist根据select的条件判断是否插入,不仅要通过primary和unique,还要通过其他条件。例如:INSERTINTOuser(name)SELECT'telami'FROMdualWHERENOTEXISTS(SELECTidFROMuserWHEREid=1)这个方法其实是用了mysql中的临时表,只是里面用到了子查询,效率会有点影响。如果你可以使用上面的不要使用这个。4.replaceinto,如果有相同primary或??unique的记录,先删除。然后插入一条新记录。REPLACEINTOuserSELECT1,'telami'FROMbooks这个方法是先删除再插入,不管有没有相同的记录。另外,关注公众号Java技术栈,后台回复:面试,可以获取我整理的MySQL面试题及答案。练习选择第二种方法{item.id},#{item.username},#{item.mobileNumber})ONduplicateKEYUPDATEidid=id这里是Mybatis,一个批量插入的操作,mobile_number加入了唯一约束。这样在批量插入的时候,如果有相同的手机号,就不会再插入了。最后关注公众号Java技术栈,后台回复:面试,可以拿到我整理的Java和MySQL系列面试题及答案,很全。