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,这个原因要再查下?

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的



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值