社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL update语句一个“经典”的坑

Java大后端 • 5 年前 • 479 次点击  
作者:朱康
来源:http://tech.dianwoda.com

起因

最近好几次有开发同学在钉钉上问我,比如下图:
问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记录并没有被更新…

结论

小结:在一条UPDATE语句中,如果要更新多个字段,字段间不能使用“AND”,而应该用逗号分隔。

现象

刚遇到这个问题的时候,我拿到这条语句直接在测试库里面执行了一把,发现确实有问题,但和开发描述的还是有区别,这里我用测试数据来模拟下:
有问题的SQL语句:
update apps set owner_code='43212' and owner_name='李四' where 
owner_code='13245' and owner_name='张三'

执行之前的记录是这样的:
执行之后的记录是这样的:
可以看到,结果并不像这位开发同学说的“好像没有效果”,实际上是有效果的:
owner_name的值没有变,但owner_code变成了0!

why? 分析

看起来,语法是完全没有问题,翻了翻MySQL官方文档的update语法:
看到assignment_list的格式是以逗号分隔的col_name=value列表,一下子豁然开朗,开发同学想要的多字段更新语句应该这样写:
update apps set owner_code='43212' , owner_name='李四' where 
owner_code='13245' and owner_name='张三';  
倒回去再重试验一把:
果然,这下得到了想要的结果!
小结:在一条UPDATE语句中,如果要更新多个字段,字段间不能使用“AND”,而应该用逗号分隔。
后记:后面等有空的时候,又回过头来看了一下,为什么使用“AND”分隔的时候,会出现owner_code=0的奇怪结果?多次尝试之后发现:
update apps set owner_code='43212' and owner_name='李四' where 
own
er_code='13245' and owner_name='张三';  
等价于:
update apps set owner_code=('43212' and owner_name='李四'where 
owner_code='13245' and owner_name='张三';  
而(‘43212’ and owner_name=’李四’)是一个逻辑表达式,而这里不难知道owner_name并不是‘李四’。因此,这个逻辑表达式的结果为false,false在MySQL中等价于0!


(完)


最近热文:
分享一份Java架构师学习资料!
一次性搞定 Nginx 限流,问你怕不怕!
面试必考:TCP 的三次握手与四次挥手
一百多道难搞的面试题,你能答对了多少?
又臭又长!流着泪我也要把它给改完!
放弃Hibernate、JPA、Mybatis!
都说了多少遍,不要再学 JSP 了!

——长按关注Java大后端——



戳原文,获取一份面试题资料!
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/71647