大数据量数据,MySql批量插入时,如何不插入重复的数据?

4a6e7a8109aa659fde4dc67e92f47c69.png

来源 | blog.csdn.net/qq_41107231/article/details/117911314

整理:匠心零度

◆ 前言

Mysql插入不重复的数据,当大数据量的数据需要插入值时,要判断插入是否重复,然后再插入,那么如何提高效率?解决的办法有很多种,不同的场景解决方案也不一样,数据量很小的情况下,怎么搞都行,但是数据量很大的时候,这就不是一个简单的问题了。

◆ insert ignore into

会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过当前插入的这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

控制器方法:

/**
 * 插入员工数据
 */
@PostMapping("save")
@ResponseBody
public CommonResult<Employee> save(@RequestBody Employee employee){
    return employeeService.saveEmp(employee);
}
INSERT INTO 插入数据
<!--插入员工数据-->
<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
    INSERT INTO t_employee(id, name, age, salary, department_id)
    VALUES (#{id},#{name},#{age},#{salary},#{departmentId})
</insert>

de645e7d1cc2cd3922480e364bf5e986.png

我们新增一条主键ID为1的员工记录。

当我再发送一次请求的时候,会报SQL语句执行错误,因为主键唯一,并且ID=1的记录已经存在了。

7387c2f8a186dacb308bc2f225deb4ef.png

加上ignore,再次添加一条ID=1的员工记录

INSERT IGNORE INTO

5de62f72bc92e7cf3201015eec52d2b2.png

并没有报错,但是也没有添加成功,忽略了重复数据的添加。

◆ on duplicate key update

当主键或者唯一键重复时,则执行update语句。

ON DUPLICATE KEY UPDATE id = id

我们任然插入ID=1的员工记录,并且修改一下其他字段(age=25):

5b7de1011a8e2c19c8065562898a13b7.png

查看数据库记录:

3c065737530ab44ce22ae111b50da5fc.png

可以看到并没有改变,数据也只有一条,并且返回了成功的提示。

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

扩展:这种方式还有其他业务场景的需求->>>定时更新其他字段。

我们在员工表中,再加入一个时间字段:

private Date updateTime;

2c8f256bda45504af171a7500fbb9307.png

然后我们根据updateTime字段来插入数据:

<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
    INSERT INTO t_employee(id, name, age, salary, department_id,update_time)
    VALUES (#{id},#{name},#{age},#{salary},#{departmentId},now())
    ON DUPLICATE KEY UPDATE update_time = now()
</insert>

96eb3ea3195914e61945bc2f965d2a48.png

c3294b585125423659982f7220b2b516.png

637af708bf0e9c698f3a2da187449077.png

如果插入的时候需要更新其他字段(比如age),该怎么做呢?

9e70f07318ab0241f57ae748b0d4653c.png

69a078966b7b8703351c14422bad7f7d.png

30715dbe63ae665585036efef08c7653.png

◆ replace into

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

REPLACE INTO

REPLACE INTO
<!--插入员工数据-->
<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
    REPLACE INTO t_employee(id, name, age, salary, department_id,update_time)
    VALUES (#{id},#{name},#{age},#{salary},#{departmentId},now())
</insert>

84acdd043fc4d2dafbf687148f99b33d.png

5afe66392d2c02529d4199d046d045ec.png

总结:实际开发中,用得最多的就是第二种方式,进行的批量加。

<!--插入员工数据-->
<insert id="saveEmp" parameterType="java.util.List">
    INSERT INTO t_employee(id, name, age, salary, department_id,update_time)
    VALUES
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.id},#{item.name},#{item.age},#{item.salary},#{item.departmentId},now())
    </foreach>
    ON DUPLICATE KEY UPDATE id = id
</insert>

控制器:

@PostMapping("save")
@ResponseBody
public CommonResult<Employee> save(@RequestBody List<Employee> employeeList){
    return employeeService.saveEmp(employeeList);
}

0a69df59862fe57eff80c3cf867b3882.png

如果存在相同的ID,则不会重复添加。

◆ 总结

实际工作中,使用最多的是方法二,根据不同的场景选择不同的方式使用。

往期推荐

遭遇服务器故障,这排查思路真的稳

Redis 6.0 之前为什么一直不使用多线程?

Spring Boot + Redis 三连招:Jedis,Redisson,Lettuce

java多模块项目脚手架:Spring Boot + MyBatis 搭建教程

Spring Boot 核心知识点总结!收藏以后面试用

无须下载,浏览器就能完成接口调试,快来试试

除了Swagger-ui,你还可以信任knife4j

Java实现短信验证码最佳实践

4ecf4f1ad4e7cfe0c2b2bf6af3eeaec5.png

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值