mysql case when 处理顺序_mysql case when update 更新顺序 | 学步园

首先认为,在同一个事务里更新多条记录,mysql执行顺序和binlog的生成顺序一致

java代码中调用jdbc如下次序更新数据库,

Tx.begin

SQL1

SQL2

SQL3

Tx.end

那么生成的binlog还是SQL1、SQL2、SQL3执行顺序

但是在含有case when update语句中,生成的binlog顺序和,不是按照语句中从左到右的顺序的

Connection con = DriverManager.getConnection(url, user, password);

Statement stmt = con.createStatement();

con.setAutoCommit(false);

String st = "UPDATE `jw_user` SET `nick_name` = 1WHEN id = 6 THEN 1WHEN id = 5 THEN 1WHEN id = 4 THEN 1592 END";

stmt.execute(st);

con.commit();

操作结果,id为 4,5,6的对应的nick_name字段均改为1,但是id为7的nick_name对应的值从0改为null,这个原因要再查下?

13a67192dd94296f57b553e76f7dbd3c.png

binlog内容

13600996 BEGIN

13600997 /*!*/;

13600998 # at 322956114

13600999 # at 322956166

13601000 #130626 18:40:57 server id 110 end_log_pos 322956166 Table_map: `jingwei`.`jw_user` mapped to number 6526373

13601001 #130626 18:40:57 server id 110 end_log_pos 322956291 Update_rows: table id 6526373 flags: STMT_END_F

13601002 ### UPDATE jingwei.jw_user

13601003 ### WHERE

13601004 ### @1=4

13601005 ### @2='1592'

13601006 ### SET

13601007 ### @1=4

13601008 ### @2='1'

13601009 ### UPDATE jingwei.jw_user

13601010 ### WHERE

13601011 ### @1=5

13601012 ### @2='4925'

13601013 ### SET

13601014 ### @1=5

13601015 ### @2='1'

13601016 ### UPDATE jingwei.jw_user

13601017 ### WHERE

13601018 ### @1=6

13601019 ### @2='2952'

13601020 ### SET

13601021 ### @1=6

13601022 ### @2='1'

13601023 ### UPDATE jingwei.jw_user

13601024 ### WHERE

13601025 ### @1=7

13601026 ### @2='0'

13601027 ### SET

13601028 ### @1=7

13601029 ### @2=NULL

13601030 # at 322956291

13601031 #130626 18:40:57 server id 110 end_log_pos 322956318 Xid = 2073115838

13601032 COMMIT/*!*/;

发现mysql内部(innodb)执行更新的顺序是按照主键的升序进行的,而不是sql语句字面顺序,先执行id等于6的,再执行id等于5的,最后执行id等于4的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值