批量插入,存在则更新,不存在则插入: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>
分类:
mysql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下