劝退版-MySQL这样写UPDATE
共 941字,需浏览 2分钟
· 2021-11-11
最近好几次有开发同学在钉钉上问我,比如下图:
![](https://filescdn.proginn.com/11f3d98297835d3276b96fa86b6a02b2/1e47f98870ba94de2c4828cb3250e076.webp)
问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记录并没有被更新...
刚遇到这个问题的时候,我拿到这条语句直接在测试库里面执行了一把,发现确实有问题,但和开发描述的还是 有区别 ,这里我用测试数据来模拟下:
有问题的SQL语句
![](https://filescdn.proginn.com/6d0eb1be4349355a447502eb1ae937ee/56314ab73a6cab055e976db01c2c54c4.webp)
执行之前的记录是这样的:
![](https://filescdn.proginn.com/c7b20d50029ff140c737145415e7ebdd/19a39a28a5cba0114b9f4bda1f35b954.webp)
执行之后的记录是这样的:
![](https://filescdn.proginn.com/5559eb3650898a79cabb2fbf67176c58/050ddbdfc8e65fa3711274f7ff5f32f2.webp)
可以看到,结果并不像这位开发同学说的“好像没有效果”,实际上是有效果的:
![](https://filescdn.proginn.com/3e363bc88446af7b61fe59f1389c93f8/de80b55b771f9257a53f86313b1f673c.webp)
推荐下自己做的 Spring Boot 的实战项目:
https://github.com/YunaiV/ruoyi-vue-pro
why?
看起来,语法是完全没有问题,翻了翻MySQL官方文档的update语法:
![](https://filescdn.proginn.com/87ef8dfb3675f110c8fd8f324f60bcb9/d8fad936ecddbaacb09adb6fe2664736.webp)
看到assignment_list的格式是以逗号分隔的col_name=value列表,一下子豁然开朗,开发同学想要的多字段更新语句应该这样写:
![](https://filescdn.proginn.com/4ae243a5f3f9a3bfc3ec5d98fb746ba6/b03565798b70d27aa9a0c30182564d6a.webp)
推荐下自己做的 Spring Cloud 的实战项目:
https://github.com/YunaiV/onemall
倒回去再重试验一把
![](https://filescdn.proginn.com/57835cd15b7836f84dc45e9170b1ca36/f02af5bcd02d458a8f850cb0bbbb8015.webp)
果然,这下得到了想要的结果!
小结 : 在一条UPDATE语句中,如果要更新多个字段,字段间不能使用“AND”,而应该用逗号分隔。
后记 : 后面等有空的时候,又回过头来看了一下,为什么使用“AND”分隔的时候,会出现owner_code=0的奇怪结果?多次尝试之后发现:
![](https://filescdn.proginn.com/4ea6731723939f97e459d3a06efb309e/d8bfc3cf533acc43e28d4eb2a57b8aa3.webp)
等价于:
![](https://filescdn.proginn.com/4be1c8f8d1cf10509defe08804694f00/aa14accb9b315e0d963668d2dc078f2f.webp)
而 ('43212' and owner_name='李四') 是一个逻辑表达式,而这里不难知道owner_name并不是‘李四’。因此,这个逻辑表达式的结果为 false , false在MySQL中等价于0!
来源:ju.outofmemory.cn/entry/336774
欢迎关注“Java引导者”,我们分享最有价值的Java的干货文章,助力您成为有思想的Java开发工程师!