MYSQL批量UPDATE的两种方式

发布时间:2026/7/25 5:32:48

MYSQL批量UPDATE的两种方式 工作中遇到批量更新的场景其实是比较常见的。但是该如何正确的进行批量UPDATE很多时候往往有点头大。这里列2种可用的方式供选择(请选择方式一手动狗头。)。如果使用了MyBatis增强组件MyBatisPlus如果使用了MyBatisPlus可以参考官网给出的解决方式(updateBatchById)或者自己查一下。批量UPDATE方式一SQL内foreach举个??update idupdateUserForBatch parameterTypecom.bees.srx.entity.UserEntity foreach collectionlist itementity separator; UPDATE sys_user SET password#{entity.password},age#{entity.age} where id #{entity.id} /where /foreach /update这样写肯定比 在业务方法中for循环单条update的效率是要高的。但是如果遇到大批量的更新动作可能也会产生效率低下的问题。原因是SQL内的foreach本质上还是循环插入每一条数据会产生list.size()个单条插入的独立SQL语句每一条 UPDATE 语句都会被单独发送到数据库服务器执行。这意味着如果列表中有100个元素就会产生100次数据库往返通信。这种方式不仅效率低下而且对于大型批处理操作来说可能会导致性能瓶颈和资源浪费。优化:通过JDBC批处理通过MyBatis的SqlSession提供的批处理功能来手动执行批量更新。try (SqlSession session sqlSessionFactory.openSession(ExecutorType.BATCH)) { UserMapper mapper session.getMapper(UserMapper.class); for (UserEntity user : userList) { mapper.updateUser(user); } session.commit(); }这里mapper.updateUser就是单条的UPDATE语句。通过这种方式MyBatis 会在内存中积累所有的更新命令然后在调用session.commit()时一次性提交给数据库这比逐条执行要高效得多。注意是否存在效率差异未实践过可能存在误人子弟的嫌疑。批量UPDATE方式二INSERT ON DUPLICATE KEY UPDATEupdate idupdateForBatch parameterTypecom.bees.srx.entity.UserEntity insert into sys_user (id,username,password) values foreach collectionlist indexindex itemitem separator, (#{item.id}, #{item.username}, #{item.password}) /foreach ON DUPLICATE KEY UPDATE passwordvalues(password) /update不建议使用。要求较多而且容易出现死锁。注意事项唯一键约束确保 sys_user 表中的 id 字段有唯一键约束通常是主键。如果 id 不是唯一的ON DUPLICATE KEY UPDATE 将不会触发更新操作。性能这种方式在大数据量的情况下比多次单独的 INSERT 和 UPDATE 操作要高效得多。事务管理确保这个操作在一个事务中执行以保证数据的一致性。如果中间发生错误可以回滚整个操作。字段顺序确保 VALUES 函数中的字段顺序与 ON DUPLICATE KEY UPDATE 子句中的字段顺序一致。总结建议使用方式一或者其优化方式(JDBC批处理)。各位也可以与AI对话看看给出的建议是什么。有问题一定要留言啊各位。及时发现及时改错。

相关新闻