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

74次阅读
没有评论

共计 5213 个字符,预计需要花费 14 分钟才能阅读完成。

这篇文章主要介绍了如何解决 mysql 多个字段 update 时错误使用 and 连接字段的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

执行语句一

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 =
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 =
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)

 

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“如何解决 mysql 多个字段 update 时错误使用 and 连接字段的问题”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计5213字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)