mysql> select * from t;
+------+------+
| col1 | col2 |
+------+------+
| 1 | 0 |
+------+------+
表t中col1=1,col2=0,在MySQL中执行
update t set col2=col1+1,col1=2;
结果会是:
mysql> select * from t;
+--+--+
| col1 | col2 |
+--+--+
| 2 | 2 |
+--+--+
如果是执行
update t set col1=2,col2=col1+1;
只是换了下col1和col2的赋值顺序,结果是
mysql> select * from t;
+--+--+
| col1 | col2 |
+--+--+
| 2 | 3 |
+--+--+
col2的值前者是2,后者是3。如果是符合标准SQL的update语句,结果不管col1和col2的赋值顺序,col2的结果都是第一个update语句的结果,即为2。
在update语句中,如果字段(col2)赋值表达式包含了另一个被更新的字段(col1),MySQL和标准SQL处理是有区别的。标准的SQL中,无论被更新字段col1的set语句在col2的set语句前还是后,col2的赋值表达式中始终是使用col1原来的值。而MySQL,如果col1在col2之前被赋值,那么col2的赋值表达式中使用的是col1被改变的值,如果col1在col2之后被赋值,那么col2的赋值表达式中使用的是col1原来的值。