MySQL如何优雅处理批量新增和更新?ON DUPLICATE KEY UPDATE用它!
场景:一张用户表user,此时我需要批量新增用户,如果用户已经存在了,则更新该条记录;如果用户不存在,则插入一条数据。
痛点:常规做法新增更新各写一个接口。而且是批量操作,比较繁琐,容易出错。不优雅。
改进:mysql支持ON DUPLICATE KEY UPDATE的写法,这种做法可以优雅处理批量更新和插入。
在MYSQL中,使用INSERT INTO … ON DUPLICATE KEY UPDATE语句来在插入或更新数据时,利用唯一索引,来更新其他字段。
举例,user表:
| 字段 | 含义 |
|---|---|
| id | 主键 |
| work_number | 工号,唯一索引 |
| address | 地址 |
| phone | 电话 |
| birthday | 生日 |
在批量新增员工信息的时候,id自增,工号是唯一的,不允许重复。当work_number不存在的时候,希望在user表中插入一条新纪录;反之work_number存在的时候,对该条记录更新其它属性(address、phone、birthday)。
INSERT INTO user (work_number, address, phone, birthday)
VALUES ('10001', '员工宿舍101', '15708181900', '2002-5-13')
ON DUPLICATE KEY UPDATE
address VALUES(address),
phone VALUES(phone),
birthday VALUES(birthday)
在这个示例中,我们省略了 id 字段,因为它是自增的,数据库会自动为新插入的记录生成一个唯一的 id 值。我们只需提供除 id 之外的字段值,并利用唯一索引work_number来检查是否存在匹配记录。如果匹配到现有记录,就会执行 ON DUPLICATE KEY UPDATE 部分,更新其他字段的值。
如果你需要进行批量插入,聪明的你一定能想到使用MyBatis提供的foreach标签。
INSERT INTO user (work_number, address, phone, birthday)
VALUES<foreach item="item" index="index" collection="list" separator=",">(#{item.work_number},#{item.address},#{item.phone},#{item.birthday})</foreach>
ON DUPLICATE KEY UPDATE
address VALUES(address),
phone VALUES(phone),
birthday VALUES(birthday)
再举一个例子,如果我们新增一个部门属性department_number,然后唯一索引变成唯一组合索引(department_number, work_number),此时sql应该变成什么样了呢?
user表新增部门属性:
| 字段 | 含义 |
|---|---|
| id | 主键 |
| deparment_number | 部门号,唯一组合索引(deparment_number,work_number ) |
| work_number | 工号 |
| address | 地址 |
| phone | 电话 |
| birthday | 生日 |
INSERT INTO user (department_number, work_number, address, phone, birthday)
VALUES ('001', '10001', '员工宿舍101', '15708181900', '2002-5-13')
ON DUPLICATE KEY UPDATE
address VALUES(address),
phone VALUES(phone),
birthday VALUES(birthday)
在该示例中,我们省略了 id 字段,因为它是自增的,数据库会自动为新插入的记录生成一个唯一的 id 值。我们只需提供除 id 之外的字段值,并利用唯一组合索引department_number,work_number来检查是否存在匹配记录。如果匹配到现有记录,就会执行 ON DUPLICATE KEY UPDATE 部分,更新其他字段的值。
批量的和上面批量例子相同,大家可以参照。
在service层的逻辑就变成了简单地把待插入的数据集合传到mapper,然后通过sql去插入或者更新,可谓是非常优雅了。
相关文章:
MySQL如何优雅处理批量新增和更新?ON DUPLICATE KEY UPDATE用它!
场景:一张用户表user,此时我需要批量新增用户,如果用户已经存在了,则更新该条记录;如果用户不存在,则插入一条数据。 痛点:常规做法新增更新各写一个接口。而且是批量操作,比较繁琐&…...
网络安全(加密, Hashing, 证书, SSL/TLS等)学习小结
网上看到的一些关于网络安全的学习资料小结。 对称加密: 通信双方共享同一个密钥。发送方用它来加密,接收方用它来解密。 非对称加密: 有公钥和私钥。 现在的做法一般是用非对称加密生成?钥(公钥还是私钥?)用于传输?࿰…...
缓冲技术在嵌入式中的应用
引言 在嵌入式中,不可避免地会遇到数据的收发。 其实,数据的收发有很多情况。 总体上,分为数据的收和发: 其中,数据发送是一个主动的行为,我们对要发送数据的数量特点等都是知道的,比如我们通过…...
vscode交叉编译cmake工程,toolchains设置
在 Visual Studio Code 中编译 CMake 项目时,使用自定义工具链(toolchains)可以很有用,特别是当你需要交叉编译或使用不同的编译器时。以下是在 Visual Studio Code 中使用自定义工具链的一般步骤,以aarch64的嵌入式为…...
MATLAB算法实战应用案例精讲-【优化算法】季节优化算法(SOA)(附MATLAB代码实现)
前言 世界上许多地方一年有四个季节:春、夏、秋、冬。每个季节的天气都不一样。随着天气的变化,生物,尤其是树木会改变它们的行为来适应天气。森林中的每一个个体都被称为一棵树。在满足终止条件之前,森林中的树木通过类似于自然界树木生命周期的四种操作:更新、竞争、播种…...
DevOps持续集成与交付
概述 Jenkins是一个支持容器化部署的、使用Java运行环境的开源软件,使用Jenkins平台可以定制化不同的流程与任务、以自动化的机制支持DevOps领域中的CI与CD,在软件开发与运维的流程中自动化地执行软件工程项目的编译、构建、打包、测试、发布以及部署&a…...
lambda的使用案例(1)
lambda的使用案例 1、分组转换为map Map<String, List<IdaasUserInfoVO>> map userWithOrgVOS1.stream().collect(Collectors.groupingBy(IdaasUserInfoVO::getOrgId));2、map循环 map.forEach(this::saveOrUpdateUser); private void saveOrUpdateUser(String …...
nodejs+vue装修公司CRM系统设计elementui
第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:技术背景 5 3.2.2经济可行性 6 3.2.3操作可行性: 6 3.3 项目设计目标与原则 6 3.4系统流程分析 7 3.4.1操作流程 7 3.4.2添加信息流程 8 3.4.3删除信息流程 9 第4章 系统设计 11 …...
开源博客项目Blog .NET Core源码学习(3:数据库操作方式)
开源博客项目Blog采用SqlSugar模块连接并操作数据库,本文学习并记录项目中使用SqlSugar的方式和方法。 首先,数据库连接信息放在了App.Hosting项目的appsettings.json中DbConfig节,支持在DbConfig节配置多个数据库连接信息,以…...
QT--Opencv下报错Mat/imwrite/imread找不到文件
像file not found这类错误 原因是编程系统找不到所指库文件,以此为例,排查自己的每个位置是否有误 1. .pro文件 添加opencv动态库 INCLUDEPATH /usr/include \/usr/include/opencv4 \/usr/include/opencv4/opencv2LIBS /usr/lib/aarch64-linux-gnu…...
风光储一体化能源中心 | 数字孪生智慧能源
自“双碳”目标提出以来,我国能源产业不断朝着清洁低碳化、绿色化的方向发展。其中,风能、太阳能等可再生能源在促进全球能源可持续发展、共建清洁美丽世界中被寄予厚望。风能、太阳能具有波动性、间歇性、随机性等特点,主要通过转化为电能再…...
JavaScript数组分组
数组分组: 含义: 数据按照某个特性归类 1. reducefn(cur, index)作为对象的key,值为按照fn筛选出来的数据 // 利用reduce分组 function group(arr, fn) {// 不是数组if (!Array.isArray(arr)) {return arr}// 不是函数if (typeof fn ! function) {throw new TypeError(fn…...
IEEE PDF eXpress系统报错:TimesNewRoman PS-BoldMT, ItalicMT, PSM
问题: IEEE PDF eXpress系统报错:Errors: Font TimesNewRomanPS-BoldMT, TimesNewRomanPS-ItalicMT, TimesNewRomanPSMT is not embedded (137x on pages 2-6) 答案: 主要原因是PDF的字体嵌入问题,可以看到下图中没有报错中的字体…...
【MATLAB源码-第40期】基于matlab的D*(Dstar)算法栅格路径规划仿真。
1、算法描述 D*算法路径规划 D*算法(Dynamic A*)是A*算法的一种变种,主要用于在地图中的障碍物信息发生变化时重新计算路径,而不需要从头开始。该算法适用于那些只有部分信息已知的环境中。 工作原理: 1. D*算法首先…...
Pikachu-xxe (xml外部实体注入漏洞)过关笔记
Pikachu-xxe过关笔记 有回显探测是否有回显file:///协议查看本地系统文件php://协议查看php源代码(无法查看当前网页代码,只能看别的)http://协议爆破开放端口(两者的加载时间不同) 无回显第一步第二步第三步 运行结果…...
Unity实现设计模式——责任链模式
Unity实现设计模式——责任链模式 责任链模式定义:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。 在职责链模式中&…...
Java中String转换为double类型
这次的java作业是写一个数字转换的小项目,其中从输入框中获取的是String类型,但是要进行数字操作,此时要用到很多操作String类型数据的方法了。 从javafx输入框中获取到String类型后,首先是要判断是否能转换为数字或者小数形式&a…...
不同埋深地下管线的地质雷达响应特征分析
不同埋深地下管线的地质雷达响应特征分析 前言 以混凝土管线为例,建立了不同埋深(70cm、100cm、130cm)地下管线的二维模型,进行二维地质雷达正演模拟,分析不同材质管线的地质雷达响应特征。 文章目录 不同埋深地下管…...
重新认识mysql
title: “重新认识mysql” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” 文章目录 title: "重新认识mysql" createTime: 2022-03-06T15:…...
系统集成|第十九章(笔记)
目录 第十九章 风险管理19.1 风险管理的概述及相关概念19.2 主要过程19.2.1 规划风险管理19.2.2 识别风险19.2.3 实施定性风险分析19.2.4 实施定量风险分析19.2.5 规划风险应对19.2.6 控制风险 上篇:第十八章、安全管理 下篇:第二十章、收尾管理 第十九…...
泰克TBS2000示波器保存功能全攻略:从U盘插入到图片导出(附最佳格式选择)
泰克TBS2000示波器高效保存指南:从硬件操作到专业文档整合 在电子工程实验室的日常工作中,波形数据的保存与共享是每个工程师都会遇到的高频需求。传统用手机拍摄屏幕的方式不仅画质堪忧,还常常因为反光、角度偏差导致关键参数无法辨识。泰克…...
告别重复造轮子,用快马AI一键生成高复用登录组件提升效率
在开发官网登录入口时,我们常常需要重复处理用户认证、表单验证、状态管理等基础逻辑。这些工作虽然不复杂,但每次从零开始确实会消耗不少时间。最近我发现用InsCode(快马)平台可以快速生成高质量的登录组件,大大提升了开发效率。 组件功能设…...
从防火墙到AI:企业级网络异常检测方案选型指南(2024最新版)
从防火墙到AI:企业级网络异常检测方案选型指南(2024最新版) 当某跨国零售企业遭遇持续3天的DDoS攻击导致线上业务瘫痪时,技术团队发现传统防火墙规则库已48小时未更新;而当某金融机构因AI模型误判正常促销流量为异常导…...
如何通过WechatRealFriends解决微信单向好友检测难题
如何通过WechatRealFriends解决微信单向好友检测难题 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends 在数字化社…...
一文搞懂训练大模型的数据怎么准备!
谈到大模型,很多人第一反应都是模型参数大、算力强,但其实数据才是大模型真正的底座。没有足够大、足够干净的数据,再先进的模型也发挥不出威力。今天就从数据层面,把大模型训练的几个关键环节梳理清楚。 数据采集与清洗 大模型训…...
GPT-5-Codex CLI实战:如何用UIUIApi中转服务稳定获取API Key(避坑指南)
GPT-5-Codex CLI高效实践:国内开发者API接入全流程解析 最近在技术社区里,关于GPT-5-Codex的讨论热度持续攀升。作为一名长期关注AI编程工具的开发者,我发现很多同行在尝试接入这项服务时遇到了各种技术障碍。本文将分享一套经过实战验证的完…...
1949–2024年中国县级行政区划(逐年)|全国范围、75年连续、SHP格式
🔍 数据简介 本数据集完整覆盖 1949年至2024年 共 76个年份 的中国县级行政区划边界,是目前公开可获取的时间跨度最长、更新粒度最细的全国县级历史区划产品。 每一年份均提供独立、闭合、无重叠的面状矢量边界,属性表包含标准名称、行政区划…...
字节开源AI神器DeerFlow,4.1万星标刷屏,普通人免费就能用
文章目录这玩意儿不是ChatGPT那种"嘴炮型"选手35k星标怎么来的?字节这次把"龙虾"养明白了多智能体协作:不是一个人在战斗沙箱执行:让AI真的"动手"干活对比OpenAI:免费、本地、可控普通人怎么上手&a…...
从GOPATH到Go Mod:老项目迁移必知的5个文件结构陷阱
从GOPATH到Go Mod:老项目迁移必知的5个文件结构陷阱 当Golang社区在2018年推出Go Modules时,很少有人预料到这个看似简单的包管理工具会成为Go语言发展史上的分水岭。四年后的今天,仍有大量遗留项目困在GOPATH的泥潭中,而迁移过程…...
Midjourney 图像到图像转换:真实人物与动漫的一致性与多样场景选择
Midjourney 拥有强大的图像到图像转换能力。本文将手把手教你如何在我们的 AceDataCloud 网站 上将照片切换到任何动漫场景,同时保持角色的一致性。 通过以下步骤,我们可以轻松实现角色一致性。 接下来,我们看一下效果,原始图像如…...
