MySQL这样写UPDATE语句,劝退

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL这样写UPDATE语句,劝退

# 起因

最近,好几次有开发同学在钉钉上问我,比如下图:

b089cbcbf2af3f1037ce1d322816aa3.png

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

# 结论

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

# 现象

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

有问题的SQL语句:

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

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

56d06a2f66d0280118e24d4caaff399.png

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

4b61e55f5ccce29de72bb41dabb565a.png

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

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

# why? 分析

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

f312bdf2e9b47c6b226aacae55e8a3f.png

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

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

倒回去再重试验一把:

b2984f322e5ab10aa88d97b5c76145b.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!

 


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
MySQL UPDATE 更新
MySQL UPDATE 更新
|
9月前
|
SQL 关系型数据库 MySQL
总结vue3 的一些知识点:MySQL UPDATE 更新
总结vue3 的一些知识点:MySQL UPDATE 更新
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
74 0
|
9月前
|
SQL Oracle 关系型数据库
【MySQL异常】1093 - You can‘t specify target table ‘daily_job‘ for update in FROM clause
【MySQL异常】1093 - You can‘t specify target table ‘daily_job‘ for update in FROM clause
82 0
|
10月前
|
关系型数据库 MySQL 数据库
对于mysql数据库delect from,truncate table,drop table, update操作的时候如何选择
对于mysql数据库delect from,truncate table,drop table, update操作的时候如何选择
80 2
|
6天前
|
供应链 关系型数据库 MySQL
MySQL的`FOR UPDATE`详解
MySQL的`FOR UPDATE`详解
8 0
|
28天前
|
关系型数据库 MySQL 数据库
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
29 0
|
28天前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL优化(3/3)-limit 优化、count 优化、update 优化、SQL优化 小结
MySQL数据库——SQL优化(3/3)-limit 优化、count 优化、update 优化、SQL优化 小结
252 0
|
2月前
|
SQL 存储 关系型数据库
深入理解MySQL中的UPDATE JOIN语句
MySQL的UPDATE JOIN语句用于根据关联表的条件更新数据。示例中,历史记录表有用户账号字段,新增列用于存储用户名。通过UPDATE JOIN,一次性将账号转换为用户名。关键点包括准确的连接条件、谨慎使用WHERE子句以及在更新前进行测试。此操作提高了数据处理效率,但也需小心操作以防止数据错误。
76 4
深入理解MySQL中的UPDATE JOIN语句
|
2月前
|
Oracle 关系型数据库 MySQL
【MySQL】8. 基本查询(update/delete/聚合/分组)
【MySQL】8. 基本查询(update/delete/聚合/分组)
43 0