每次这样写 Update 语句,怕是离开除不远了 !

简介: 每次这样写 Update 语句,怕是离开除不远了 !

1起因

最近,好几次有开发同学问这样的SQL问题,如下图:

image.png

问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记录并没有被更新…

2结论

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

3现象

刚遇到这个问题的时候,我拿到这条语句直接在测试库里面执行了一把,发现确实有问题,但和开发描述的还是有区别,这里我用测试数据来模拟下:

有问题的SQL语句:

update apps set owner_code='43212' and owner_name='李四' where owner_code='13245' and owner_name='张三';

执行之前的记录是这样的:

image.png

执行之后的记录是这样的:

image.png

可以看到,结果并不像这位开发同学说的“好像没有效果”,实际上是有效果的:

owner_name的值没有变,但owner_code变成了0!

4why? 分析

看起来,语法是完全没有问题,翻了翻MySQL官方文档的update语法:

image.png

看到assignment_list的格式是以逗号分隔的col_name=value列表,一下子豁然开朗,开发同学想要的多字段更新语句应该这样写:

update apps set owner_code='43212' , owner_name='李四' where owner_code='13245' and owner_name='张三';

倒回去再重试验一把:

image.png

果然,这下得到了想要的结果!

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

后面等有空的时候,又回过头来看了一下,为什么使用“AND”分隔的时候,会出现owner_code=0的奇怪结果?多次尝试之后发现:

update apps set owner_code='43212' and owner_name='李四' where owner_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!


目录
相关文章
|
5月前
|
运维 Serverless 数据处理
函数计算产品使用问题之遇到生成没有反应、中止也不行,以及刷新后队列积累的问题,该怎么办
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
Python
改变循环执行的状态
在编程中,循环是常用的控制结构之一,它允许代码块在一定条件下重复执行。然而,有时候我们可能需要在循环执行过程中改变其状态,比如提前终止循环或跳过当前迭代进入下一次迭代。Python提供了break和continue语句,帮助我们改变循环的执行状态。下面,我们将详细介绍如何使用这两个语句来改变循环的执行状态,并附上示例代码。
59 0
|
安全 小程序 Java
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(1)
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(1)
|
安全 小程序 Java
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(2)
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(2)
删除一段时间内的记录,关键在于删除时筛选条件确定删除范围
删除一段时间内的记录,关键在于删除时筛选条件确定删除范围
95 0
|
SQL 关系型数据库 MySQL
十一、操作delete或者update语句,加个limit或者循环分批次删除
十一、操作delete或者update语句,加个limit或者循环分批次删除
320 0
|
缓存 NoSQL 算法
这么秀的操作我竟然到现在才了解到?合并请求~
在几年前,我就看到过有些博客写关于合并请求的文章,一开始我没有太在意,最近在看一个up讲述关于商品模块的牛X设计,为了提高高并发的处理能力,一般会用redis 自增自减来实现库存扣减,但是他采用合并扣减库存,也就是同一时间n个扣减库存会合并成一个请求,这样无疑减少了IO次数,也提高系统性能
285 1
这么秀的操作我竟然到现在才了解到?合并请求~
DHL
|
存储 算法 Java
卷起来,突破35岁焦虑,动画演示CPU记录函数调用过程,进互联大厂如此简单
通过这篇文章,能够了解到 方法如何调用 、 方法执行完之后如何返回、 内存如何记录方法调用过程。方法调用和返回过程涉及到了,虚拟机栈、程序计数器、局部变量表、操作数栈、方法返回地址、动态链接 等等内容
DHL
159 0
卷起来,突破35岁焦虑,动画演示CPU记录函数调用过程,进互联大厂如此简单
|
SQL 存储 关系型数据库
我说 SELECT COUNT(*) 查询很慢,面试官让我回去等通知
我说 SELECT COUNT(*) 查询很慢,面试官让我回去等通知
|
存储 安全 关系型数据库
完蛋,公司被一条 update 语句干趴了!
不要小看一条 update 语句,在生产机上使用不当可能会导致业务停滞,甚至崩溃。 当我们要执行 update 语句的时候,确保 where 条件中带上了索引列,并且在测试机确认该语句是否走的是索引扫描,防止因为扫描全表,而对表中的所有记录加上锁。 我们可以打开 MySQL 里的 sql_safe_updates 参数,这样可以预防 update 操作时 where 条件没有带上索引列。 如果发现即使在 where 条件中带上了列索引列,优化器走的还是全标扫描,这时我们就要使用 force index([index_name]) 可以告诉优化器使用哪个索引。
完蛋,公司被一条 update 语句干趴了!