批量插入,存在则更新,不存在则插入:ON DUPLICATE KEY UPDATE

语法:insert into t_user_1 values(11,'王五',13),(9,'王五1111',13),(5,'王五111',13),(6,'王五1111',23) ON DUPLICATE KEY UPDATE  name = VALUES(name) ,age = VALUES(age)

需求:插入设备,device_id为雪花算法主键id,device_code为唯一索引,批量插入多条device ,device_code存在的跟新,不存在的添加

落地实现:

复制代码
 <insert id="onDuplicateKeyUpdate">
        insert into aiot_device(device_code,tenant_id,is_online,channel_num,
        device_info,product_type,edge_host_id,device_id)
        values
            <foreach collection="devices" separator="," item="device">
                (#{device.deviceCode},#{device.tenantId},#{device.isOnline},
                 #{device.channelNum},#{device.deviceInfo},
                #{device.productType},#{device.edgeHostId},#{device.deviceId})
            </foreach>
        on duplicate key update
             tenant_id=values(tenant_id),
             is_online=values(is_online),
             channel_num=values(channel_num),
             device_info=values(device_info),
             product_type=values(product_type),
             edge_host_id=values(edge_host_id),
             device_id=values(device_id)
    </insert>
复制代码

//测试代码 因为批量添加,且是自己写的sql MP没有自动添加雪花算法主键,这里自行手动添加 IdWorker.getIdStr()

复制代码
 /**
     * 获得 Camera 列表
     *
     * @author xzj
     * @since 2022-05-07
     */
    @GetMapping("/1")
    public Result list1() {
        List<Device> list = new ArrayList<>();
        list.add(new Device().setDeviceCode("1").setIsOnline("0").setDeviceInfo("aaaaa").setDeviceId(IdWorker.getIdStr()));
        list.add(new Device().setDeviceCode("2").setIsOnline("0").setDeviceInfo("bbbbb").setDeviceId(IdWorker.getIdStr()));
        list.add(new Device().setDeviceCode("5").setIsOnline("0").setDeviceInfo("ccccc").setDeviceId(IdWorker.getIdStr()));
        deviceMapper.onDuplicateKeyUpdate(list);
        return Result.success();
    }
复制代码

弊端:每次会把device_id覆盖成新的id,可是不填device_id没办法插入表,因为数据库device_id是varchar类型

增加ifnull判断解决 device_id=ifnull(device_id,values(device_id))    表示有值更新成原来的值

复制代码
   <insert id="onDuplicateKeyUpdate">
        insert into aiot_device(device_code,tenant_id,is_online,channel_num,
device_info,product_type,edge_host_id,device_id)
        values
            <foreach collection="devices" separator="," item="device">
                (#{device.deviceCode},#{device.tenantId},#{device.isOnline},
                 #{device.channelNum},#{device.deviceInfo},
                #{device.productType},#{device.edgeHostId},#{device.deviceId})
            </foreach>
        on duplicate key update
             tenant_id=values(tenant_id),
             is_online=values(is_online),
             channel_num=values(channel_num),
             device_info=values(device_info),
             product_type=values(product_type),
             edge_host_id=values(edge_host_id),
             device_id=ifnull(device_id,values(device_id))
    </insert>
复制代码

 

posted @   java架构师1  阅读(648)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示