MySql批量插⼊时如何不重复插⼊数据
⽬录
前⾔
⼀、insert ignore into
⼆、on duplicate key update
三、replace into
总结
前⾔
Mysql插⼊不重复的数据,当⼤数据量的数据需要插⼊值时,要判断插⼊是否重复,然后再插⼊,那么如何提⾼效率?解决的办法有很多种,不同的场景解决⽅案也不⼀样,数据量很⼩的情况下,怎么搞都⾏,但是数据量很⼤的时候,这就不是⼀个简单的问题了。
⼀、insert ignore into
会忽略数据库中已经存在的数据,如果数据库没有数据,就插⼊新的数据,如果有数据的话就跳过当前插⼊的这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插⼊数据的⽬的。
控制器⽅法:
/**
* 插⼊员⼯数据
*/
@PostMapping("save")
@ResponseBody批量更新sql语句
public CommonResult<Employee> save(@RequestBody Employee employee){
return employeeService.saveEmp(employee);
}
INSERT INTO 插⼊数据
<!--插⼊员⼯数据-->
<insert id="saveEmp" parameterType="com.ity.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.ity.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.ity.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,则不会重复添加。
总结
实际⼯作中,使⽤最多的是⽅法⼆,根据不同的场景选择不同的⽅式使⽤。
到此这篇关于MySql批量插⼊时如何不重复插⼊数据的⽂章就介绍到这了,更多相关MySql不重复插⼊内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论