当前位置: 首页 > news >正文

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去插入或者更新,可谓是非常优雅了。

http://www.lryc.cn/news/178016.html

相关文章:

  • 网络安全(加密, Hashing, 证书, SSL/TLS等)学习小结
  • 缓冲技术在嵌入式中的应用
  • vscode交叉编译cmake工程,toolchains设置
  • MATLAB算法实战应用案例精讲-【优化算法】季节优化算法(SOA)(附MATLAB代码实现)
  • DevOps持续集成与交付
  • lambda的使用案例(1)
  • nodejs+vue装修公司CRM系统设计elementui
  • 开源博客项目Blog .NET Core源码学习(3:数据库操作方式)
  • QT--Opencv下报错Mat/imwrite/imread找不到文件
  • 风光储一体化能源中心 | 数字孪生智慧能源
  • JavaScript数组分组
  • IEEE PDF eXpress系统报错:TimesNewRoman PS-BoldMT, ItalicMT, PSM
  • 【MATLAB源码-第40期】基于matlab的D*(Dstar)算法栅格路径规划仿真。
  • Pikachu-xxe (xml外部实体注入漏洞)过关笔记
  • Unity实现设计模式——责任链模式
  • Java中String转换为double类型
  • 不同埋深地下管线的地质雷达响应特征分析
  • 重新认识mysql
  • 系统集成|第十九章(笔记)
  • 【Linux】Linux远程访问Windows下的MySQL数据库
  • android安卓core tombstone .pb
  • C++简单实现红黑树
  • 国庆加速度!新增功能点锁定功能,敏捷开发新增估算功能,助力项目快速突破!
  • uniapp 如何动态切换应用图标、名称
  • CUDA学习笔记0929
  • XML-Based Configuration Beans for Ioc Container
  • 俞敏洪:董宇辉在北京有房子了!
  • 蓝桥等考Python组别七级006
  • 港联证券:股市3000点什么意思?
  • windows 下 vs code 格式化代码(clang-format)