目录

前言

解决方案

1、insert ignore into

2、on duplicate key update

3、insert … select … where not exist

4、replace into

综合以上实现去重的方案选择:

提供Mybatis示例:

Mapper.xml文件:


前言

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

业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入。那么问题来了,是不是每次插入之前都要查一遍,看看重不重复,在代码里筛选一下数据,重复的就过滤掉呢?

向大数据数据库中插入值时,还要判断插入是否重复,然后插入。

如何提高效率?

看来这个问题不止我一个人苦恼过。解决的办法有很多种,不同的场景解决方案也不一样,数据量很小的情况下,怎么搞都行,但是数据量很大的时候,这就不是一个简单的问题了。几百万的数据,不可能查出来去重处理!

解决方案

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

这种方法就是不管原来有没有相同的记录,都会先删除掉然后再插入。

综合以上实现去重的方案选择:

建议选择第二种方式。

提供Mybatis示例:

void saveBatch(@Param("data") List<TbProjectDTO> data, @Param("currentUserId") Long userId);

Mapper.xml文件:

    <insert id="saveBatch"  parameterType="ArrayList">INSERT INTO `tb_project_cost_lmm`(`id`, `tenant_id`, `project_id`, `edit_vid`,  `creator_id`, `modifier_id`)VALUES<foreach collection="data" item="item" index="index" separator="," >(#{item.id},#{item.tenantId},#{item.projectId},#{item.editVid},#{currentUserId},#{currentUserId})</foreach>ON DUPLICATE KEY UPDATEis_main_material = IF(state_deleted = 0, is_main_material , 0),modifier_id=#{currentUserId},state_deleted=0,state_disabled=0,state_locked=0;</insert>

这里用的是Mybatis,批量插入的一个操作,通过联合唯一索引(tenantId,projectId,editVid),已经加了唯一约束;重复数据中针对不需要或者需要修改的字段,可以通过if进行判断处理(IF(逻辑判断, 为真结果 , 为假结构)。如上,这样在批量插入时,如果存在同一租户-项目-编辑版本下相同数据的话,是不会再插入了的。当然这是个非常浅显的例子,实际项目中也有很多场景,这就不再探索。

如果本篇文章对你有帮助的话,很高兴能够帮助上你。

当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。

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

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

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

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

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

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

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

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

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

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

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

  6. Mysql批量插入更新性能优化

    Mysql批量插入更新性能优化 对于数据量较大的插入和更新,因io/cpu等性能瓶颈,会产生大量的时间消耗,目前主流的优化主要包括预编译.单条sql插入多条数据.事务插入等,下面详细介绍一下: 单条插 ...

  7. mysql批量插入跟更新_Mysql批量插入和更新的性能

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

  8. node.js中mysql批量插入更新的三种方法

    [背景]在项目中遇到一个批量插入数据的需求,由于之前写过的sql语句都是插入一个对象一条数据,于是去网上搜关键词 "sql批量插入"."mysql批量插入"等, ...

  9. mysql 批量插入亿级数据做测试用

     mysql 批量插入亿级数据做测试用 表结构: -- 性能提升 SELECT COUNT(*) from `user`.`user` ; SHOW VARIABLES; set session bu ...

  10. MySQL 批量插入:如何不插入重复数据?

    以下文章来源方志朋的博客,回复"666"获面试宝典 知识这个东西,看来真的要温故而知新,一直不用,都要忘记了???? 业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表 ...

最新文章

  1. SAP CRM WebClient UI控制器方法DETACH_STATIC_OVW_VIEWS的作用
  2. 在python中字符串可以使用什么来表示_Python 字符串定义
  3. 网络智能和大数据公开课Homework3 Map-Reduce编程
  4. C#保存CookieContainer到文件
  5. 通达信服务器文件是那个文件夹,通达信的公式在哪个文件夹?
  6. 栈这种数据结构,不就后进先出?
  7. 用计算机求算术平方根,6.1用计算机计算算术平方根.ppt
  8. HDwiki 源代码 - 互动百科开源
  9. android图片涂鸦(标记)
  10. 机器学习之变分推断(三)基于平均场假设变分推断与广义EM
  11. 保研导师联系邮件模板
  12. jQuery.Deferred对象
  13. 高新技术企业申请后多久会出结果呢?
  14. 【Pytorch-从一团乱麻到入门】:1、Pytorch、jupyter notebook 的安装及设置
  15. 如何从Facebook组中删除帖子
  16. 软件开发——软技能(一、IDE)
  17. 【流媒体技术】流媒体(1)使用nginx搭建流媒体服务器
  18. 孪生质数——孤独的质数
  19. 使用cut命令将空格用作定界符
  20. 使用Ab命令对Apache服务器进行负载压力测试

热门文章

  1. 自己写的免费音乐播放器
  2. c语言小游戏之一看就会的推箱子
  3. 缓和曲线06七次四项式
  4. 无符号、有符号数运算判溢出
  5. 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
  6. 通过PS合成金鱼在灯泡里畅游的场景
  7. 史上最全交互设计原则(四)之尼尔森十大交互原则
  8. 大连python培训费用-大连Python培训
  9. CSS3样式设计-李强强-专题视频课程
  10. Android UI 设计笔记