Mybatis insert 批量导入 并对已存在数据进行更新

本文介绍了MySQL的onDuplicateKeyUpdate功能,用于在批量导入数据时处理重复键的情况,通过示例展示了如何根据主键和唯一索引判断并更新已有数据。此外,还分享了在MyBatis中使用该功能的具体代码实现,解决批量插入与更新的需求。

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>

到此完美解决需求

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值