网站投放广告费用,公司网站的推广,eclipse视频网站开发,经营网站建设场景#xff1a;一张用户表user#xff0c;此时我需要批量新增用户#xff0c;如果用户已经存在了#xff0c;则更新该条记录#xff1b;如果用户不存在#xff0c;则插入一条数据。 痛点#xff1a;常规做法新增更新各写一个接口。而且是批量操作#xff0c;比较繁琐一张用户表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)
VALUESforeach itemitem indexindex collectionlist 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_numberwork_number来检查是否存在匹配记录。如果匹配到现有记录就会执行 ON DUPLICATE KEY UPDATE 部分更新其他字段的值。
批量的和上面批量例子相同大家可以参照。 在service层的逻辑就变成了简单地把待插入的数据集合传到mapper然后通过sql去插入或者更新可谓是非常优雅了。