mysql case when update 更新顺序

来源:互联网 发布:刘诗诗婚纱同款 淘宝 编辑:程序博客网 时间:2024/06/06 04:38

首先认为,在同一个事务里更新多条记录,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 BEGIN13600997 /*!*/;13600998 # at 32295611413600999 # at 32295616613601000 #130626 18:40:57 server id 110  end_log_pos 322956166   Table_map: `jingwei`.`jw_user` mapped to number 652637313601001 #130626 18:40:57 server id 110  end_log_pos 322956291   Update_rows: table id 6526373 flags: STMT_END_F13601002 ### UPDATE jingwei.jw_user13601003 ### WHERE13601004 ###   @1=413601005 ###   @2='1592'13601006 ### SET13601007 ###   @1=413601008 ###   @2='1'13601009 ### UPDATE jingwei.jw_user13601010 ### WHERE13601011 ###   @1=513601012 ###   @2='4925'13601013 ### SET13601014 ###   @1=513601015 ###   @2='1'13601016 ### UPDATE jingwei.jw_user13601017 ### WHERE13601018 ###   @1=613601019 ###   @2='2952'13601020 ### SET13601021 ###   @1=613601022 ###   @2='1'13601023 ### UPDATE jingwei.jw_user13601024 ### WHERE13601025 ###   @1=713601026 ###   @2='0'13601027 ### SET13601028 ###   @1=713601029 ###   @2=NULL                                                                                                       13601030 # at 32295629113601031 #130626 18:40:57 server id 110  end_log_pos 322956318   Xid = 207311583813601032 COMMIT/*!*/;

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



原创粉丝点击