1、前言
最近做的项目中,需要实现管理员批量导入用户数据,如果批量导入的数据中包含数据库已存在数据,则对数据库已存在数据进行更新;如果是新的数据,则直接插入。
查了一下mysql,发现居然还有on duplicate key update的用法
2、on duplicate key update
若新插入的行与表中现有记录的唯一索引或主键中产生重复值,那么就会发生旧行的更新
on duplicate key update xxx(字段)=修改的值(values)
3、实战
3.1测试
创建一张表:

增加数据:

测试1:(包含主键id)
insert into student (id,name,snu,sex) values (1,"王五","20220806","男")
ON DUPLICATE KEY UPDATE
name = VALUES(name),
snu = VALUES(snu),
sex =VALUES(sex)
- 添加前:

- 添加后

可以看到是根据主键来判断,如果主键重复则执行update。
测试2:(不包含主键id)
给学号设置唯一索引

insert into student (name,snu,sex) values ("蝙蝠侠","20205","男")
ON DUPLICATE KEY UPDATE
name = VALUES(name),
snu = VALUES(snu),
sex =VALUES(sex)
- 添加前:

- 添加后

可以看到,此时是根据唯一索引来进行判断 ,如果唯一索引重复则执行update
测试三:(没有主键和唯一索引重复时的情况)
insert into student (name,snu,sex) values ("蜘蛛侠","20220607","男")
ON DUPLICATE KEY UPDATE
name = VALUES(name),
snu = VALUES(snu),
sex =VALUES(sex)

可以发现,此时是新增一条数据,说明如果主键和唯一索引都不重复的情况执行insert。
3.2、项目中在mybatis里面具体代码如下:
<insert id="saveByExcel">
insert into t_user (uid,password,name,sex,academy_id,department_id,audit_status,create_time) values
<foreach collection="users" item="user" separator=",">
(#{user.uid},#{user.password},#{user.name},#{user.sex},#{user.academyId},#{user.departmentId},#{user.auditStatus},
#{user.createTime})
</foreach>
on duplicate KEY UPDATE
name=values(name),
password=values(password),
sex=values(sex),
academy_id=values(academy_id),
department_id=values(department_id),
audit_status=values(audit_status),
create_time=values(create_time)
</insert>
到此完美解决需求
本文介绍了MySQL的onDuplicateKeyUpdate功能,用于在批量导入数据时处理重复键的情况,通过示例展示了如何根据主键和唯一索引判断并更新已有数据。此外,还分享了在MyBatis中使用该功能的具体代码实现,解决批量插入与更新的需求。
1835

被折叠的 条评论
为什么被折叠?



