mysql批量更新报错_Mysql批量更新的三种方式
前言
批量插入由于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批量更新的三种方式相关推荐
- mysql表删除回滚_MySQL删除表的三种方式(小结)
drop table drop 是直接删除表信息,速度最快,但是无法找回数据 例如删除 user 表: drop table user; truncate (table) truncate 是删除表数 ...
- mysql中如何获取字段类型_MySQL获取字段类型的三种方式
1. INFORMATION_SCHEMA.COLUMNS INFORMATION_SCHEMA是每个MySQL实例中的数据库,该实例存储有关MySQL服务器维护的所有其他数据库的信息. 如查询某一个 ...
- Mysql存储过程老是报错_mysql中看看这个存储过程老是报错,该如何处理
mysql中看看这个存储过程老是报错 我的mysql版本是5.5.21的,下面这个存储过程是需要更加另外3张表的数据来更新strategycontracttemp中数据,但是每次更新到中途报错,先代码 ...
- mysql安装开始报错_MYSQL安装报错 -- 出现Failed to find valid data directory.
运行环境:windows10 数据库版本:mysql.8.0.12 安装方式:rpm包直接安装 问题描述: mysql初始化的时候找不到对应的数据库存储目录 报错代码: 2018-10-13T03:2 ...
- mysql查找语句报错_MYSQL报错注入-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....
目录 审计思路报错语句报错函数查询表floor报错函数讲解报错原理语句xpath语法报错函数讲解语句整数溢出报错exppowcot列名重复报错name_constjoin using几何函数报错不存在 ...
- mysql语句delete报错_MySQL delete语句的问题
以前遇到过几次这个问题,都觉得问题不大,所以没有记录,但是这次又遇到了,而且没有第一时间想起来,所以还是有记录下的必要 MySQL delete语句使用子查询操作同一张表的时候会抛出 DELET ...
- mysql的count报错_mysql的floor()报错注入方法详细分析
刚开始学习sql注入,遇见了 select count(*) from table group by floor(rand(0)*2); 这么条语句.在此做个总结. (更好的阅读体验可访问 这里 ) ...
- mysql用in报错_Mysql子查询IN中使用LIMIT
学习下Mysql子查询IN中使用LIMIT的方法. 这两天项目里出了一个问题,mysql LIMIT使用后报错. 需求是这样的,我有3张表,infor信息表,mconfig物料配置表,maaply物料 ...
- mysql的count报错_Mysql报错注入原理分析count、rand、groupby
0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截图,然后执行sql语句证明一下结论,但是没有人去深入研究为什么rand不能和o ...
最新文章
- 二叉树代码 java面试题_《剑指offer》面试题39 二叉树的深度(java)
- Asp.net常用技巧
- 卡巴斯基:风险无国界 网络安全从业者要与小网民保持一致
- Python之进程+线程+协程(同步对象、信号量、队列)
- 如何让 MSN 与应用系统紧密集成起来?
- 建立时间和保持时间关系详解
- 使用ServletContextListener关闭Redisson连接
- MCSA / Windows Server 2016 PowerShell DSC
- Error: ENOENT: no such file or directory, scandir .....
- BGP 自动路由聚合
- 加性噪声(目前不理解)
- 幅频特性曲线protues_频率响应,幅频特性,增益与相位裕量,波特图
- word 计算机内存不足,电脑office打不开显示内存不足怎么办
- leader说用下httpclient的重试,但我没用,因为我有更好的方案。
- DeepCross Network(DCN)
- Mysql拼接查询结果
- Unity编辑器扩展——在Editor下动态添加监听事件
- 【语音识别】基于VQ特定人孤立词语音识别附matlab代码
- 少女长期与宠物睡觉 遭“宠物虫”噬骨导致瘫痪
- 【二级】(Word、Excel)使用邮件合并技术制作邀请函