广告位联系
返回顶部
分享到

MYSQL批量UPDATE的两种方式介绍

Mysql 来源:互联网 作者:佚名 发布时间:2024-11-16 10:52:47 人浏览
摘要

工作中遇到批量更新的场景其实是比较常见的。 但是该如何正确的进行批量UPDATE,很多时候往往有点头大。 这里列2种可用的方式,供选择(请选择方式一,手动狗头。)。 如果使用了MyBatis增强

工作中遇到批量更新的场景其实是比较常见的。
但是该如何正确的进行批量UPDATE,很多时候往往有点头大。
这里列2种可用的方式,供选择(请选择方式一,手动狗头。)。

如果使用了MyBatis增强组件MyBatisPlus,可以参考官网给出的解决方式(updateBatchById),或者自己查一下。

批量UPDATE方式一:SQL内foreach

举个????

1

2

3

4

5

6

7

8

9

<update id="updateUserForBatch" parameterType="com.bees.srx.entity.UserEntity">

    <foreach collection="list" item="entity" 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 提供的批处理功能来手动执行批量更新。

1

2

3

4

5

6

7

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 UPDATE

1

2

3

4

5

6

7

8

9

10

11

<update id="updateForBatch" parameterType="com.bees.srx.entity.UserEntity">

    insert into sys_user

    (id,username,password) values

    <foreach collection="list" index="index" item="item" separator=",">

        (#{item.id},

        #{item.username},

        #{item.password})

    </foreach>

    ON DUPLICATE KEY UPDATE

     password=values(password)

</update>

不建议使用。要求较多,而且容易出现死锁。

注意事项

  • 唯一键约束:确保 sys_user 表中的 id 字段有唯一键约束(通常是主键)。如果 id 不是唯一的,ON DUPLICATE KEY UPDATE 将不会触发更新操作。
  • 性能:这种方式在大数据量的情况下比多次单独的 INSERT 和 UPDATE 操作要高效得多。
  • 事务管理:确保这个操作在一个事务中执行,以保证数据的一致性。如果中间发生错误,可以回滚整个操作。
  • 字段顺序:确保 VALUES 函数中的字段顺序与 ON DUPLICATE KEY UPDATE 子句中的字段顺序一致。

总结:

建议使用方式一,或者其优化方式(JDBC批处理)。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • mysql怎么执行流程

    mysql怎么执行流程
    MySQL 架构与SQL执行流程 MySQL主要而分为server层和存储引擎层两部分 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQ
  • MYSQL批量UPDATE的两种方式介绍
    工作中遇到批量更新的场景其实是比较常见的。 但是该如何正确的进行批量UPDATE,很多时候往往有点头大。 这里列2种可用的方式,供选择
  • mysql中general_log日志的实现介绍
    1.记录范围:这个log里面会记录MySQL所有的SQL语句,不管是查询语句,还是DML语句,还是DDL语句,还是DCL语句,这些语句统统都会被记录在
  • Mysql8.4.3LTS中离线部署的实现

    Mysql8.4.3LTS中离线部署的实现
    一、部署环境 软件:mysql8.4.3LTS 系统:ubuntu24.04 资源配置 资源分配的大小与业务系统的体量有关系;所以没有固定 CPU:2核 内存:4 GB 磁盘
  • Navicat连接MySQL出现2059错误的解决方案介绍
    Navicat连接MySQL出现2059错误 在Navicat中连接MySQL时遇到错误代码2059,这表示MySQL服务器不接受Navicat客户端提供的加密插件。 MySQL 8.0 及以上版本
  • mysql时间戳格式化yyyy-mm-dd的使用介绍

    mysql时间戳格式化yyyy-mm-dd的使用介绍
    格式化到 年月日 1 2 3 4 # 将时间换成列名就行;当前是秒级时间戳,如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m
  • mysql-8.0.15-winx64安装与修改密码方式介绍

    mysql-8.0.15-winx64安装与修改密码方式介绍
    第一步:下载 移步官网:https://www.mysql.com/downloads/下载一个压缩包(个人版) 第二步:安装 解压安装包,根据自己的喜好选择路径 将安装
  • mysql中Innodb行锁实现原理介绍
    一、Innodb行锁的实现 【1】Innodb的行锁是通过给索引的索引项加锁来实现的 【2】Innodb按照辅助索引进行数据操作时,辅助索引和主键索引都将
  • windows-mysql8.0.15如何修改密码、重置密码

    windows-mysql8.0.15如何修改密码、重置密码
    windows-mysql8.0.15 修改密码、重置密码 打开命令窗口cmd 输入命令:net stop mysql,停止MySQL服务。 1 net stop mysql 如果出现下图提示,就则需要用管
  • Mysql主从同步怎么重置

    Mysql主从同步怎么重置
    服务器强制重启,导致MySQL主从数据库出现数据不一致问题,主从数据库数据相差较大,无法完成数据同步,出现报错。 因此,需要进行主
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计