mysql-批量更新

2023-10-31

方法一:用update结合case、then实现

原始SQL语句

UPDATE baginfo_2021_09 
    SET channel_id = CASE id 
        WHEN 1 THEN 3 
        WHEN 2 THEN 4 
        WHEN 3 THEN 5 
    END, 
    stationId = CASE id 
        WHEN 1 THEN 6
        WHEN 2 THEN 7
        WHEN 3 THEN 8
    END
WHERE id IN (1,2,3)

mybatis写法

    <update id="updateBatchCaseThen" parameterType="java.util.List">
        update baginfo_2022_03
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="clientId =case" suffix="end,">
                <foreach collection="list" item="i" index="index">
                    <if test="i.clientId!=null">
                        when id=#{i.id} then #{i.clientId}
                    </if>
                </foreach>
            </trim>
            <trim prefix="model_version =case" suffix="end,">
                <foreach collection="list" item="i" index="index">
                    <if test="i.model_version!=null">
                        when id=#{i.id} then #{i.model_version}
                    </if>
                </foreach>
            </trim>
            <trim prefix="create_time =case" suffix="end,">
                <foreach collection="list" item="i" index="index">
                    <if test="i.create_time!=null">
                        when id=#{i.id} then #{i.create_time}
                    </if>
                </foreach>
            </trim>
        </trim>
        where
        <foreach collection="list" separator="or" item="i" index="index">
            id=#{i.id}
        </foreach>
    </update>

方法二:用foreach循环实现

mybatis写法

    <update id="batchUpdateBagInfo" parameterType="com.example.demo.entity.BagInfo">
        <foreach collection="list" item="item" index="index" open="" close="" separator=";">
            update baginfo_2022_03
            <set>
                <if test="item.clientId != null">
                    clientId = #{item.clientId},
                </if>
                <if test="item.model_version != null">
                    model_version = #{item.model_version},
                </if>
                <if test="item.create_time != null">
                    create_time = #{item.create_time},
                </if>
            </set>
            where id = #{item.id}
        </foreach>
    </update>

用这种方法时,yml文件中配置的数据库URL,需要加上&allowMultiQueries=true

性能比较

mysql表数据量:2000w;一次更新数据量:1000

更新方法 更新总耗时
单条循环更新(for) 1-3s
方法1 110ms-180ms
方法2 110ms-180ms

总体比较,单条循环更新最慢的,想想也知道。而方法1和方法2的耗时相差不大。更高数量的批量更新,可能会导致结果不同,这里暂时没有测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql-批量更新 的相关文章

  • Laravel 5.4 升级 - 违反完整性约束 - 列不能为空

    奇怪的是 所有这些都在 5 2 中工作 但我不知道可以改变什么来实现这一点 下面是错误和正在插入的数组 SQLSTATE 23000 Integrity constraint violation 1048 Column gender can
  • 如何将行变成列?

    我有一个数据库 其中存储分组到项目中的关键字以及与每个关键字相关的数据 然后我显示每个项目的数据网格 每个关键字一行和几列 全部从同一个表 数据 中检索 我有 4 个表 关键字 项目 group keywords 和数据 keywords
  • PHP使用auto_increment生成短唯一ID?

    我想生成一个简短的 唯一的 ID 而不必检查冲突 我目前正在做类似的事情 但是我当前生成的 ID 是随机的 并且在循环中检查冲突很烦人 并且如果记录数量显着增加 将会变得昂贵 通常担心冲突不是问题 但我想要生成的唯一 ID 是一个由 5 8
  • 如何导出带有数据的 MySQL 架构?

    我有一个完整的架构 其中有许多表 其中包含 MySQL 查询浏览器中的数据 现在我想将这个包含所有表 数据的完整数据库发送给我的同事 我怎样才能将其发送给我的同事 以便他可以将这个完整的架构放入他的 MySQL 查询浏览器中 Thanks
  • MySQL Python 关于重复键更新值

    我正在研究使用 python 将 JSON 数据上传到 MySQL 我需要在插入语句中包含 ON DUPLICATE KEY UPDATE VALUES 但在 Python 中遇到了问题 如果我运行以下代码 一切正常 import json
  • MySQL 数据库无法在 XAMPP for Mac 上启动

    突然我在 mac 上遇到了这个问题 我无法启动我的 MySQL 数据库 我只能启动 ProFTPD 和 Apache Web Server 这是应用程序日志 Starting all servers Starting MySQL Datab
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • MySQL 左连接 WHERE table2.field = "X"

    我有以下表格 pages Field Type Null Key Default Extra page id int 11 NO PRI NULL auto increment type varchar 20 NO NULL
  • 从 call_log 中获取最大并发通话数

    我需要帮助在 MySQL 5 0 77 中编写一个查询 根据下面所示的数据 办公室一天的通话量 返回并发电话呼叫的峰值数量 我只是想知道一天中任何特定时间同时打电话的人数最多是多少 首先 这是 MySQL 表 CREATE TABLE ca
  • 没有提示指令的直连接中表的顺序是否会影响性能?

    所有基于 SQL 的 RDBMS 10 年前的版本 直接连接查询 没有提示指令 中的表顺序是否会对最佳性能和内存管理产生影响 听说最后一个join应该是最大的表 您的数据库的查询优化器如何处理这种情况 回答你的问题 是的 表的顺序在连接中有
  • 显示和随机化 php 数组

    我有一个显示结果的数组 如下所示 Array 0 gt 71 1 gt 56 2 gt 64 3 gt 82 4 gt 90 5 gt 80 6 gt 65 7 gt 62 8 gt 14 9 gt 3 我的代码是 while row my
  • 将IP保存到数据库中

    当用户登录时 我想将他们的 IP 保存在数据库中 我该怎么做呢 MySQL 字段最适合使用哪种类型 获取IP的PHP代码是什么样的 我正在考虑将其用作登录 会话内容的额外安全功能 我正在考虑使用用户现在拥有的 IP 检查用户从数据库登录的
  • MySql 视图脚本中的注释

    可以这样做吗 我尝试过多个 gui mysql workbench navicat toad for mysql 但没有一个保存这样的注释 something important select something else importan
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • MYSQL:如何在同一查询中联接两个表,两次引用同一个表

    我有两张桌子 我正在尝试将下面的示例两个表与表 1 引用表 2 两次结合起来 例如 如果我查看表 1 组 2 和成员 7 它应该查找表 2 中的 ID 并给出输出 Group Members Name Name 2 7 Blue Dog T
  • 从表中选择行,其中另一个表中具有相同 id 的行在另一列中具有特定值

    在 MySQL 中 如果我们有两个表 comments key value 1 foo 2 bar 3 foobar 4 barfoo and meta comment key value 1 1 2 1 3 2 4 1 我想得到来自以下人
  • 使用函数的 SQL 查询 - 如何获取列表的最大计数

    如何查询 MAXIMUM COUNT 交易次数 我的代码如下 SELECT customer id COUNT customer id FROM rental GROUP BY customer id HAVING MAX COUNT cu
  • 选择获取与 MySQL Group 中 max 对应的整行

    当我使用Max使用后查找特定 MySQL 组中字段的最大值GROUP BY 是否可以获取包含最大值的整行 我在处理一些论坛代码时偶然发现了这个线程 我想获取每个线程的最新帖子并将其显示在特定板的线程列表中 Quassnoi上面的回答对我非常
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的

随机推荐

  • PostMan的安装和使用教程

    postman的下载 官网 https www getpostman com downloads 创建账号或者用谷歌浏览器账号登录 一个demo了解一下 我做的是一个app 后台使用java做的 app通过ajax来请求后台 但是我不知道后
  • gcc编译步骤

    可以一步一步得到对应运行结果 o 其实跟重命名差不多
  • Java Collections.replaceAll()方法具有什么功能呢?

    转自 Java Collections replaceAll 方法具有什么功能呢 下文笔者讲述Collections replaceAll 方法的功能简介说明 如下所示 Collections replaceAll 方法的功能 用于替换集合
  • CPAN常见问题集

    CPAN常见问题集 想要更详细的关于perl的文档 你应该到这里来看看 www perl com 如果想看perl FAQ 可以到这里来 perlfaq cpan org 1998 2001 Elaine Ashton
  • Linux定时任务:ERROR (getpwnam() failed) 解决方法

    设置了个定时任务 但是发现没有执行 查看日志如下 root xw crm dep d tail f var log cron Aug 13 22 09 01 dep crond 1619 system RELOAD etc crontab
  • postgreSQL离线安装(rpm包方式)

    1 下载pg的rpm包 https yum postgresql org 根据选择适合的版本 这里以centos7和pg13 0为例 下载好这四个rpm包 postgresql13 server 13 0 1PGDG rhel7 x86 6
  • 开心档-软件开发入门之MongoDB 高级索引

    作者简介 每天分享MongoDB教程的学习经验 和学习笔记 座右铭 有自制力 做事有始有终 学习能力强 愿意不断地接触学习新知识 个人主页 iOS开发上架的主页 前言 本章将会讲解在数组中创建索引 需要对数组中的每个字段依次建立索引 所以在
  • 按键实现顺序一次亮2个led,顺序一次灭2个led

    c语言实现编程 keil51 点亮led灯 学习记录 在以前的基础上实现按一下 亮俩个 按一下 灭俩个 解决一直存在的问题 1 char代表的首位为符号位 1为负数 0为正数 所以有效位数为7位 uchar不区分 直接就是8位 2 关于右移
  • 100天精通Python(基础篇)——第4天:数据类型

    作者介绍 Python领域优质创作者 数据开发工程师 励志成为Python全栈工程师 关注我发现更多精彩 本文已收录于Python全栈系列专栏 100天精通Python从入门到就业 欢迎订阅 订阅后可私聊进Python全栈VIP交流群 手把
  • Java 流

    Java 流 什么是流 流是一个相对抽象的概念 所谓流就是一个传输数据的通道 这个通道可以传输相应类型的数据 进而完成数据的传输 这个通道被实现为一个具体的对象 字符流和字节流 抽象类 处理字节 InputStream OutputStre
  • 心电图心电轴怎么计算_需要你拿小本本记下的知识点——教你怎么看懂心电图...

    心电图 相信大家都很熟悉 但是你是否能看懂心电图呢 攻略来啦 大家可以拿小本本记下来 推荐有点医学基础的人观看 了解一下心电图怎么看 也能对自己有所帮助 接下来就让我们开始吧 心电图的波形组成 见下图 基本知识 1 拿到一个心电图 先看基本
  • python 环境配置测试,手工照敲线性回归实战

    lesson013 linear regression py import numpy as np error for y wx b def compute error for line given points b w points to
  • nodejs --buffer模块(三) buffer的操作和属性

    全局方法 Buffer byteLength string encoding 返回字符串实际字节的长度 Buffer compare buf1 buf2 比较两个buffer的前后顺序 等价于buffer1 compare buf2 Buf
  • 【Qt教程】2.2 - Qt5 布局管理器(水平、垂直、栅格布局)、弹簧、设计一个登陆界面

    使用布局管理器 来设计一个登陆界面 都是操作 没代码没理论 参照 Qt设计一登陆窗口布局 1 新建空工程 双击 ui文件 进入界面设计区 我们新建工程时候 使用的是QMainWindow类 会自动包含菜单栏 状态栏 在右上角对象浏览器中 我
  • TeleGram都有哪些限制?

    账户 用户名 形如 TGgeek 5 32字符 用户名 username 有什么用 一定要设置吗 如何设置 名字长度 1 64字符 姓氏长度 0 64字符 账号自毁时限 如果账号在一定时间内不上线 到时限后会自动删除账号和所有资料 删除后不
  • visual studio:未能加载文件或程序集“xxx.dll”或它的某一个依赖项

    1 没有添加库目录或附加库目录 2 如果dll内部有错误 也会提示这个
  • 内联元素的padding和margin

    内联元素的padding和margin能设置上吗 这是我前段时间面试某中厂被问到的一道面试题 一开始有点懵 但照自己的理解是这样回答的 内联元素不能通过改变宽高来改变元素大小 只能通过内部撑开 padding设置不上 margin left
  • rand()查询效率问题解决

    随机从数据表中取一条数据 我们一般会用到rand 函数 但是如果用不好的话 rand 的效率实在太低 基础使用 SELECT FROM tablename ORDER BY RAND LIMIT 1 这是最基本的rand 用法 实例测试 我
  • 史上最全,Spring Boot入门篇总结,收藏起来慢慢看

    Spring Boot是Spring家族下的一个全新开发框架 其设计目的主要是用来简化Spring应用的创建及开发过程 它提供了自动配置 starter依赖等特性 从而使开发人员从大量的XML配置中解脱出来 Spring Boot致力于在蓬
  • mysql-批量更新

    方法一 用update结合case then实现 原始SQL语句 UPDATE baginfo 2021 09 SET channel id CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5