• ADADADADAD

    如何解决mysql多个字段update时错误使用and连接字段的问题[ mysql数据库 ]

    mysql数据库 时间:2024-11-26 22:16:19

    作者:文/会员上传

    简介:

    执行语句一update spoken set book_id = 2 and unit_id = 14 and article_id = 47409 where id = 284989;结果为只将book_id字段值更新为0,其他字段都没有更改mysql> select

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    执行语句一

    update spoken set book_id = 2 and unit_id = 14 and article_id = 47409 where id = 284989;

    结果为只将book_id字段值更新为0,其他字段都没有更改

    mysql> select id,book_id,unit_id,article_id from spoken;

    +--------+---------+---------+------------+

    | id | book_id | unit_id | article_id |

    +--------+---------+---------+------------+

    | 284989 |5 | 55 | 55555 |

    +--------+---------+---------+------------+

    1 row in set (0.00 sec)

    mysql> update spoken set book_id = 2 and unit_id = 14 and article_id = 47409 where id = 284989;

    Query OK, 1 row affected (0.00 sec)

    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> select id,book_id,unit_id,article_id from spoken;

    +--------+---------+---------+------------+

    | id | book_id | unit_id | article_id |

    +--------+---------+---------+------------+

    | 284989 |0 | 55 | 55555 |

    +--------+---------+---------+------------+

    1 row in set (0.00 sec)

    执行语句二

    update spoken set book_id = 2,unit_id = 14,article_id = 47409 where id = 284989;(正常语句)

    三个字段值都变更为给定值,

    mysql> select id,book_id,unit_id,article_id from spoken;

    +--------+---------+---------+------------+

    | id | book_id | unit_id | article_id |

    +--------+---------+---------+------------+

    | 284989 |0 | 55 | 55555 |

    +--------+---------+---------+------------+

    1 row in set (0.00 sec)

    mysql> update spoken set book_id = 2,unit_id = 14,article_id = 47409 where id = 284989;

    Query OK, 1 row affected (0.00 sec)

    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> select id,book_id,unit_id,article_id from spoken;

    +--------+---------+---------+------------+

    | id | book_id | unit_id | article_id |

    +--------+---------+---------+------------+

    | 284989 |2 | 14 | 47409 |

    +--------+---------+---------+------------+

    1 row in set (0.00 sec)

    执行语句三

    update spoken set book_id = 2 and unit_id = 14 and article_id = 47409 where id = 284989;

    只将第一个字段变更为1

    mysql> select id,book_id,unit_id,article_id from spoken;

    +--------+---------+---------+------------+

    | id | book_id | unit_id | article_id |

    +--------+---------+---------+------------+

    | 284989 |2 | 14 | 47409 |

    +--------+---------+---------+------------+

    1 row in set (0.00 sec)

    mysql> update spoken set book_id = 2 and unit_id = 14 and article_id = 47409 where id = 284989;

    Query OK, 1 row affected (0.00 sec)

    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> select id,book_id,unit_id,article_id from spoken;

    +--------+---------+---------+------------+

    | id | book_id | unit_id | article_id |

    +--------+---------+---------+------------+

    | 284989 |1 | 14 | 47409 |

    +--------+---------+---------+------------+

    1 row in set (0.00 sec)

    分析,

    1、正常的update语法为语句二,更新多个字段的值,多个字段之间使用逗号“,”分隔。

    2、但问题语句一和问题语句三更新多个字段的值使用and ,分隔多个字段;

    且语句一将book_id变更为,语句三将book_id变更为1;

    一、问题语句一

    update spoken set book_id = 2 and unit_id = 14 and article_id = 47409 where id = 284989;

    等价于

    update spoken set book_id = (2 and unit_id = 14 and article_id = 47409)where id = 284989;

    等价于

    update spoken set book_id = (2 and (unit_id = 14)and (article_id = 47409))where id = 284989;

    相当于将book_id的值更新为下面语句的值

    select 2 and (unit_id = 14) and (article_id = 47409) from spoken where id = 284989;

    该语句由三个表达式通过mysql的逻辑运算符and连接

    表达式一为: 2

    表达式二为:unit_id = 14 (select unit_id = 14 from spoken where id = 284989;)

    表达式三为:article_id = 47409 (select article_id = 47409 from spoken where id = 284989;)

    由于当时unit_id = 55,article_id=55555

    表达一的值为2

    表达式二值为0

    表达式三的值为0

    所以select 2 and (unit_id = 14) and (article_id = 47409) from spoken where id = 284989;

    的值为2 and 0 and 0 即为。

    即执行语句的结果等价于update spoken set book_id = 0 where id = 284989;

    Mysql的逻辑运算

    http://www.cnblogs.com/pzk7788/p/6891299.html

    逻辑与 ( AND 或 && )

    (1) 当所有操作数均为非零值、并且不为 NULL 时,所得值为 1
    (2) 当一个或多个操作数为 0 时,所得值为 0
    (3) 其余情况所得值为 NULL

    mysql> SELECT 1 AND -1, 1 && 0, 0 AND NULL, 1 && NULL ;
    +----------+--------+------------+-----------+
    | 1 AND -1 | 1 && 0 | 0 AND NULL | 1 && NULL |
    +----------+--------+------------+-----------+
    | 1| 0 | 0 | NULL |
    +----------+--------+------------+-----------+

    二、同理可得语句三

    2 and unit_id = 14 and article_id = 47409

    相当于将book_id的值更新为下面语句的值

    select 2 and (unit_id = 14) and (article_id = 47409) from spoken where id = 284989;

    该语句由三个表达式通过mysql的逻辑运算符and连接

    表达式一为: 2

    表达式二为:unit_id = 14 (select unit_id = 14 from spoken where id = 284989;)

    表达式三为:article_id = 47409 (select article_id = 47409 from spoken where id = 284989;)

    由于当时unit_id = 14,article_id=47409

    表达一的值为2

    表达式二值为1

    表达式三的值为1

    所以select 2 and (unit_id = 14) and (article_id = 47409) from spoken where id = 284989;

    的值为2 and 1 and 1 即为1。

    即执行语句的结果等价于update spoken set book_id = 1 where id = 284989;

    额外的问题:

    Mysql如果对mysql的数值型如int做匹配时,unit_id字段和14做匹配时

    如下三个语句都匹配到结果

    select id,book_id,unit_id,article_id from spoken where unit_id=14;

    select id,book_id,unit_id,article_id from spoken where unit_id='14';

    select id,book_id,unit_id,article_id from spoken where unit_id='14aaa';

    (字符串转数值会截取第一个非数字前面的数字)

    mysql> select id,book_id,unit_id,article_id from spoken where unit_id=14;

    +--------+---------+---------+------------+

    | id | book_id | unit_id | article_id |

    +--------+---------+---------+------------+

    | 284989 |0 | 14 | 47409 |

    +--------+---------+---------+------------+

    1 row in set (0.00 sec)

    mysql> select id,book_id,unit_id,article_id from spoken where unit_id='14';

    +--------+---------+---------+------------+

    | id | book_id | unit_id | article_id |

    +--------+---------+---------+------------+

    | 284989 |0 | 14 | 47409 |

    +--------+---------+---------+------------+

    1 row in set (0.00 sec)

    mysql> select id,book_id,unit_id,article_id from spoken where unit_id='14aaa';

    +--------+---------+---------+------------+

    | id | book_id | unit_id | article_id |

    +--------+---------+---------+------------+

    | 284989 |0 | 14 | 47409 |

    +--------+---------+---------+------------+

    1 row in set, 1 warning (0.00 sec)

    热门标签: andmysqlupdate