首页 > 代码库 > update and的坑

update and的坑

开发那边抛出个有意思的问题,下面的现象如何解释呢?

mysql> select * from A;+------+------+| t1   | t2   |+------+------+|    1 |    1 | |    2 |    2 | |    3 |    3 | +------+------+3 rows in set (0.00 sec)mysql> update A set t1=0 and t2=5; Query OK, 3 rows affected (0.00 sec)Rows matched: 3  Changed: 3  Warnings: 0mysql> select * from A;           +------+------+| t1   | t2   |+------+------+|    0 |    1 | |    0 |    2 | |    0 |    3 | +------+------+3 rows in set (0.00 sec)update  语句 and 怎么解释?

  

Update的语法是:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...    [WHERE where_condition]    [ORDER BY ...]    [LIMIT row_count]Multiple-table syntax:UPDATE [LOW_PRIORITY] [IGNORE] table_references    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...    [WHERE where_condition]

  

select的语法:

Name: ‘SELECT‘Description:Syntax:SELECT    [ALL | DISTINCT | DISTINCTROW ]      [HIGH_PRIORITY]      [STRAIGHT_JOIN]      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]    select_expr [, select_expr ...]    [FROM table_references      [PARTITION partition_list]    [WHERE where_condition]    [GROUP BY {col_name | expr | position}      [ASC | DESC], ... [WITH ROLLUP]]    [HAVING where_condition]    [ORDER BY {col_name | expr | position}      [ASC | DESC], ...]    [LIMIT {[offset,] row_count | row_count OFFSET offset}]    [PROCEDURE procedure_name(argument_list)]    [INTO OUTFILE ‘file_name‘        [CHARACTER SET charset_name]        export_options      | INTO DUMPFILE ‘file_name‘      | INTO var_name [, var_name]]    [FOR UPDATE | LOCK IN SHARE MODE]]

  

update语法是set后面以逗号区分

mysql> select * from test where t1=0 and t2=5;
Empty set (0.00 sec)

 

使用and被解析成 t1=0 and t2=5 把后面作为一个整体,值变成0了

变成这样了,update A set t1=(0 and t2=5),t2==5 and 0 

 

换种写法更加明白了

 

先记录下,后面整体再整理!!!

update and的坑