前言

批量插入由于mysql的VALUES原生支持,使用较为便利。

批量更新的写法一般有三种,在更新数量较少的情况下,前两种性能不相上下。但是在更新字段增加,更新条数较多(500以上)建议使用第三种写法。

常规写法,拼接多个单条更新语句。

CASE...WHEN... 写法

JOIN 写法

Batch Update

spring/mybatis/JDBI都支持这种批量更新方式。

这种更新方式需要设置jdbc连接的参数:

allowMultiQueries=true

# 完整url举例

jdbc.url=jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true

具体实现以Spring的JdbcTemplate为例。

batchUpdate的主要代码如下图:

首先检查了jdbc连接是否支持批量更新操作,如果allowMultiQueries值为false,将被拦截。

然后拼接了SQL语句,拼接代码如下:

直接用分号拼接。

CASE WHEN

示例:

UPDATE test

SET code = (

CASE

WHEN id = 1 THEN 11

WHEN id = 2 THEN 22

WHEN id = 3 THEN 33

END

) WHERE id IN (1,2,3);

注意:CASE WHEN一定要和WHERE语句一起使用,否则UPDATE会遍历和更新数据库中所有的行。会把未出现在WHEN中的数据都更新成null,如果code列设置为NOT NULL则会报错,否则会置为NULL或者默认值。

JOIN

这种写法不太常见。

UPDATE `test` a JOIN

(

SELECT 1 AS id, 11 AS code, 'holy' AS name

UNION

SELECT 2 AS id, 22 AS code, 'shit' AS name

) b USING(id, code)

SET a.name=b.name;

上述SQL要表达的更新语义是:将id=1且code=11的name更新为'holy',将id=2且code=22的name更新为'shit'。

注意,条件字段必须放在USING中

性能对比

RC隔离级别

更新条数小(一般小于500条),CASE WHEN和JOIN优于UDPATE。

更新条数较大(千级别),CASE WHEN效率迅速下降,UPDATE居中,推荐使用JOIN写法

RR隔离级别

JOIN性能优于CASE WHEN,CASE WHEN优于UPDATE。

RC级别下的测试数据

数据库实例规格:8核,20G内存,100G硬盘

隔离级别:READ-COMMITTED

连接方式:JDBC

更新方式

更新300条记录平均耗时

更新3000条记录平均耗时UPDATE

230ms

560ms

CASE WHEN

110ms

1170ms

JOIN

100ms

320ms

来源:https://www.cnblogs.com/AaronCui/p/10968893.html

mysql批量更新报错_Mysql批量更新的三种方式相关推荐

  1. mysql表删除回滚_MySQL删除表的三种方式(小结)

    drop table drop 是直接删除表信息,速度最快,但是无法找回数据 例如删除 user 表: drop table user; truncate (table) truncate 是删除表数 ...

  2. mysql中如何获取字段类型_MySQL获取字段类型的三种方式

    1. INFORMATION_SCHEMA.COLUMNS INFORMATION_SCHEMA是每个MySQL实例中的数据库,该实例存储有关MySQL服务器维护的所有其他数据库的信息. 如查询某一个 ...

  3. Mysql存储过程老是报错_mysql中看看这个存储过程老是报错,该如何处理

    mysql中看看这个存储过程老是报错 我的mysql版本是5.5.21的,下面这个存储过程是需要更加另外3张表的数据来更新strategycontracttemp中数据,但是每次更新到中途报错,先代码 ...

  4. mysql安装开始报错_MYSQL安装报错 -- 出现Failed to find valid data directory.

    运行环境:windows10 数据库版本:mysql.8.0.12 安装方式:rpm包直接安装 问题描述: mysql初始化的时候找不到对应的数据库存储目录 报错代码: 2018-10-13T03:2 ...

  5. mysql查找语句报错_MYSQL报错注入-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....

    目录 审计思路报错语句报错函数查询表floor报错函数讲解报错原理语句xpath语法报错函数讲解语句整数溢出报错exppowcot列名重复报错name_constjoin using几何函数报错不存在 ...

  6. mysql语句delete报错_MySQL delete语句的问题

    以前遇到过几次这个问题,都觉得问题不大,所以没有记录,但是这次又遇到了,而且没有第一时间想起来,所以还是有记录下的必要 MySQL    delete语句使用子查询操作同一张表的时候会抛出 DELET ...

  7. mysql的count报错_mysql的floor()报错注入方法详细分析

    刚开始学习sql注入,遇见了 select count(*) from table group by floor(rand(0)*2); 这么条语句.在此做个总结. (更好的阅读体验可访问 这里 ) ...

  8. mysql用in报错_Mysql子查询IN中使用LIMIT

    学习下Mysql子查询IN中使用LIMIT的方法. 这两天项目里出了一个问题,mysql LIMIT使用后报错. 需求是这样的,我有3张表,infor信息表,mconfig物料配置表,maaply物料 ...

  9. mysql的count报错_Mysql报错注入原理分析count、rand、groupby

    0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截图,然后执行sql语句证明一下结论,但是没有人去深入研究为什么rand不能和o ...

最新文章

  1. 二叉树代码 java面试题_《剑指offer》面试题39 二叉树的深度(java)
  2. Asp.net常用技巧
  3. 卡巴斯基:风险无国界 网络安全从业者要与小网民保持一致
  4. Python之进程+线程+协程(同步对象、信号量、队列)
  5. 如何让 MSN 与应用系统紧密集成起来?
  6. 建立时间和保持时间关系详解
  7. 使用ServletContextListener关闭Redisson连接
  8. MCSA / Windows Server 2016 PowerShell DSC
  9. Error: ENOENT: no such file or directory, scandir .....
  10. BGP 自动路由聚合
  11. 加性噪声(目前不理解)
  12. 幅频特性曲线protues_频率响应,幅频特性,增益与相位裕量,波特图
  13. word 计算机内存不足,电脑office打不开显示内存不足怎么办
  14. leader说用下httpclient的重试,但我没用,因为我有更好的方案。
  15. DeepCross Network(DCN)
  16. Mysql拼接查询结果
  17. Unity编辑器扩展——在Editor下动态添加监听事件
  18. 【语音识别】基于VQ特定人孤立词语音识别附matlab代码
  19. 少女长期与宠物睡觉 遭“宠物虫”噬骨导致瘫痪
  20. 【二级】(Word、Excel)使用邮件合并技术制作邀请函

热门文章

  1. 如何用100美元和TensorFlow来造一个能“看”东西的机器人
  2. Transaction rolled back because it has rollback-only
  3. 基于LAMP的cacti安装和配置问题处理(一)
  4. 模板引擎 Velocity
  5. 浏览器跨域问题(jsonp)——jsonp详解
  6. 英语面试功略:英语口语突击法
  7. 【转】JVM内存管理:深入垃圾收集器与内存分配策略
  8. Linux绝对战胜不了Windows系统
  9. 关于二级域名Cookie的问题及解决方法
  10. 2019北京国际智慧城市、物联网、大数据博览会