MySql批量插入时如何不重复插入数据
作者:DT辰白 发布时间:2024-01-29 04:42:00
前言
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>
我们新增一条主键ID为1的员工记录。
当我再发送一次请求的时候,会报SQL语句执行错误,因为主键唯一,并且ID=1的记录已经存在了。
加上ignore,再次添加一条ID=1的员工记录
INSERT IGNORE INTO
并没有报错,但是也没有添加成功,忽略了重复数据的添加。
二、on duplicate key update
当主键或者唯一键重复时,则执行update语句。
ON DUPLICATE KEY UPDATE id = id
我们任然插入ID=1的员工记录,并且修改一下其他字段(age=25):
查看数据库记录:
可以看到并没有改变,数据也只有一条,并且返回了成功的提示。
这种方法有个前提条件,就是,需要插入的约束,需要是主键或者唯一约束(在你的业务中那个要作为唯一的判断就将那个字段设置为唯一约束也就是unique key)。
扩展:这种方式还有其他业务场景的需求->>>定时更新其他字段。
我们在员工表中,再加入一个时间字段:
private Date updateTime;
然后我们根据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>
如果插入的时候需要更新其他字段(比如age),该怎么做呢?
三、replace into
如果存在primary or unique相同的记录,则先删除掉。再插入新记录。
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>
总结:实际开发中,用得最多的就是第二种方式,进行的批量加。
<!--插入员工数据-->
<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);
}
如果存在相同的ID,则不会重复添加。
来源:https://blog.csdn.net/qq_41107231/article/details/117911314


猜你喜欢
- 前言在当前的JavaScript中,并没有枚举这个概念,在某些场景中使用枚举更能保证数据的正确性,减少数据校验过程,下面就介绍一下JavaS
- 方法一: select `name` from mysql.proc where db = 'your_db_name' a
- 本文实例为大家分享了python实现名片管理系统源代码,供大家参考,具体内容如下import osdef print_menu(): pri
- python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关
- 介绍lambdaPython用于支持将函数赋值给变量的一个操作符 默认是返回的,所以不用再加return关键字,不然会报错result =
- 1、就按单介绍MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。换句话说,用户不能对过多的数据具有过
- 1.在python文件下新建python文件,输入文件名后按Enter键生成,比如: one.py .2.简单输入python代码: pri
- 本文实例讲述了Python实现字符串格式化输出的方法。分享给大家供大家参考,具体如下:python属于强类型的语言,如果像java一样操作字
- tf.nn.conv2d与tf.layers.conv2d的区别在写CNN中注意到tensorflow目前有tf.nn.conv2d和tf.
- //只能在firefox下运行 var test = { name: "puterjam", __noSuchMetho
- 循环语句(有两种):while 语句for 语句while 语句:问题:输入一个整数n,让程序输出n行的:hello
- Python3.7引入了dataclass。dataclass装饰器可以声明Python类为数据类;数据类适合用来存储数据,一般而言它具有如
- 首先先和大家讲一讲SQL Server恢复master数据库方法,具体步骤如下第一步:复制model.mdf、mastlog.ldf、mod
- 一、认识h函数Vue推荐在绝大数情况下使用模板来创建你的HTML,然后一些特殊的场景,你真的需要JavaScript的完全编程的能力,这个时
- 运用webbrowser库中的一个函数实现自动打开浏览器:webbrowser.open(http://blog.csdn.net/ares
- 本文实例讲述了java 数据库连接与增删改查操作。分享给大家供大家参考,具体如下:1、设置数据库的基本配置信息package mysql;/
- 本教程为大家分享了Pycharm及Python安装的详细步骤,供大家参考,具体内容如下第一步:安装python1 首先进入网站下载:点击打开
- Asp开发 联通CDMA以下是在开发wap中的随笔,其中一些对于“老鸟”来说,谈不上什么,希望对初学者有所帮助,大家有什么小技巧,欢迎顶上来
- asp如何获知页面上的图象的实际尺寸大小?见下面的两个asp文件:<!--#include virtual="/i
- 在python自动化中,经常会遇到对数据文件的操作,比如添加多名员工,但是直接将员工数据写在python文件中,不但工作量大,要是以后再次遇