当前位置:首页 > 编程笔记 > 正文
已解决

MySQL如何优雅处理批量新增和更新?ON DUPLICATE KEY UPDATE用它!

来自网友在路上 182882提问 提问时间:2023-10-07 04:18:18阅读次数: 82

最佳答案 问答题库828位专家为你答疑解惑

场景:一张用户表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去插入或者更新,可谓是非常优雅了。

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"MySQL如何优雅处理批量新增和更新?ON DUPLICATE KEY UPDATE用它!":http://eshow365.cn/6-16610-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!