上一篇:深夜看了张一鸣的微博,让我越想越后怕

温故而知新

知识这个东西,看来真的要温故而知新,一直不用,都要忘记了。

业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入。

那么问题来了,是不是每次插入之前都要查一遍,看看重不重复,在代码里筛选一下数据,重复的就过滤掉呢?

向大数据数据库中插入值时,还要判断插入是否重复,然后插入。如何提高效率?

看来这个问题不止我一个人苦恼过。

解决的办法有很多种,不同的场景解决方案也不一样,数据量很小的情况下,怎么搞都行,但是数据量很大的时候,这就不是一个简单的问题了。

几百万的数据,不可能查出来去重处理!

说一下我Google到的解决方案。

1、insert ignore into

当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。例如:

INSERT IGNORE INTO user (name) VALUES ('telami')

这种方法很简便,但是有一种可能,就是插入不是因为重复数据报错,而是因为其他原因报错的,也同样被忽略了~

2、on duplicate key update

当primary或者unique重复时,则执行update语句,如update后为无用语句,如id=id,则同1功能相同,但错误不会被忽略掉。

例如,为了实现name重复的数据插入不报错,可使用一下语句:

INSERT INTO user (name) VALUES ('telami') ON duplicate KEY UPDATE id = id

这种方法有个前提条件,就是,需要插入的约束,需要是主键或者唯一约束(在你的业务中那个要作为唯一的判断就将那个字段设置为唯一约束也就是unique key)。

3、insert … select … where not exist

根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件。例如:

INSERT INTO user (name) SELECT 'telami' FROM dual WHERE NOT EXISTS (SELECT id FROM user WHERE id = 1)

这种方法其实就是使用了mysql的一个临时表的方式,但是里面使用到了子查询,效率也会有一点点影响,如果能使用上面的就不使用这个。

4、replace into

如果存在primary or unique相同的记录,则先删除掉。再插入新记录。

REPLACE INTO user SELECT 1, 'telami' FROM books

这种方法就是不管原来有没有相同的记录,都会先删除掉然后再插入。另外,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 MySQL 面试题和答案。

实践

选择的是第二种方式

<insert id="batchSaveUser" parameterType="list">insert into user (id,username,mobile_number)values<foreach collection="list" item="item" index="index" separator=",">(#{item.id},#{item.username},#{item.mobileNumber})</foreach>ON duplicate KEY UPDATE id = id
</insert>

这里用的是Mybatis,批量插入的一个操作,mobile_number已经加了唯一约束。这样在批量插入时,如果存在手机号相同的话,是不会再插入了的。

作者:telami
来源:https://www.telami.cn/

感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。

· END ·

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

2.如何才能成为优秀的架构师?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6.IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看

7.漫画:程序员相亲图鉴,笑屎我了~

8.15张图看懂瞎忙和高效的区别!

一个人学习、工作很迷茫?

点击「阅读原文」加入我们的小圈子!

MySQL 批量插入,如何不插入重复数据?相关推荐

  1. 向Mysql批量插入50万条数据

    >批量插入数据脚本 表Sql: CREATE TABLE dept( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, deptno MEDIUMINT U ...

  2. mysql批量插入亿级别的数据

    哪些情况会影响数据插入的效率 1.单次客户端与服务端之间的通信 2. mysql对主键.唯一索引.外键的校验 3. 事务检查 4. 单线程处理业务并封装sql数据(比较耗时) 针对以上情况解决方案 1 ...

  3. Mysql批量插入数据问题解决和优化

    Mysql批量插入数据问题解决和优化 一.问题描述 项目中mysql批量插入大概50000左右数据,使用事务和批量,但是速度依旧很慢,大约60s左右,迫切希望改进这个问题. 二.问题原因 尽管是批量a ...

  4. Mysql 批量插入大量数据的两种方案以及优缺点(分别是 5W 条数据和 10W 条数据)

    Mysql 批量插入(5W 条数据和 10W 条数据) 1.批量插入思路 一般是有两种不同的思路: 1.for 循环批量插入 2.生成一条 SQL 语句,比如 insert into user(id, ...

  5. 教你急速快速批量插入1000万条数据到mysql数据库表面试题

    急速快速批量插入1000万条数据到mysql数据库表面试题 教你急速快速批量插入1000万条数据到mysql数据库表&面试题 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好 ...

  6. MySQL批量插入1000w条数据

    一.概述 在一些实际的测试.运维过程中,往往需要向数据库插入大量数据,利用存储过程是一个不错的选择 本次采用MySQL5.7,模拟实际批量插入1000w条随机数据 二.创建库 mysql -uroot ...

  7. mysql批量插入数据的函数和存储过程

    -- 创建函数前,设置 set global log_bin_trust_function_creators=TRUE; -- 新建函数-产生随机的字符串 drop function if exist ...

  8. MYSQL批量插入数据库实现语句性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( ...

  9. mysql批量插入 增加参数_MySql 的批量操作,要加rewriteBatchedStatements参数

    MySql 的批量操作,要加rewriteBatchedStatements参数 作者:赵磊 博客:http://elf8848.iteye.com ------------------------- ...

  10. mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...

    利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...

最新文章

  1. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板类型别名
  2. 黑盒攻击的分类_「图像分类」图像分类中的对抗攻击是怎么回事?
  3. python array函数_Python bytearray() 函数
  4. python 中读取yaml
  5. android平板电脑系统安装程序,安卓平板电脑系统重装图解教程
  6. Spring源码解析一 (IOC容器初始化深度解析)
  7. C++ Bulider6.0下string类型问题
  8. Unity笔记-29-ARPG游戏项目-02-移动跳跃
  9. 使用DISM修复系统
  10. 游戏本自动掉帧_老显卡战新游戏 GTX1060游戏本 近期游戏大作画面设定指南
  11. python代码画樱花-python画樱花树代码 具体代码介绍
  12. linux-DNS服务器的搭建
  13. dns设置快速连接微软服务器,通过批处理快速设置windows网卡地址网关DNS
  14. 高通芯片GPU是否有类似于HSR功能
  15. 定时任务介绍及X-Job和E-Job简单对比
  16. ArcGIS 基于TIN地表面数据和建筑数据进行视域分析
  17. 用switch语句表示分段函数
  18. 云服务器仿真,仿真云平台
  19. pm ERR! syscall opennpm ERR! path D:\ele-admin-template-20220902/package.jsonnpm ERR! errno -4058
  20. gw4c20b发动机_gw4c20b发动机油耗

热门文章

  1. Jersey 2.x 运行项目
  2. C# this关键字(给底层类库扩展成员方法)
  3. 怎样在js中使用EL表达式
  4. 一种自动(半自动)学习的算法(验证码识别)
  5. logstash+elasticsearch +kibana 日志管理系统
  6. jqGrid宽度自适应
  7. 一串数字中有两个只出现一次的数字其余都是成对相同,求这两个数
  8. Lightroom Classic 教程,如何在 Lightroom 中增强照片的孤立区域?
  9. inDesign教程,如何将inDesign文档导出为 PDF 文件?
  10. Ps 初学者教程,如何使用图层蒙版合成图像?