MySQL千万不要这样写update语句

 更新时间:2021年11月09日 10:56:03   作者:朱康  
MySQL中update语句用于更新表中的现有数据,亦可用UPDATE语句来更改表中单个行,一组行或所有行的列值,这篇文章主要给大家介绍了关于MySQL千万不要这样写update语句的相关资料,需要的朋友可以参考下

前言

今天给大家分享一个 MySQL 非常经典的 “坑”。MySQL 的 UPDATE 语句千万不能这么写!

起因

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

问题归纳起来就是:在 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 
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千万不要这样写update语句的文章就介绍到这了,更多相关MySQL写update语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中的CONCAT()函数:轻松拼接字符串的利器

    MySQL中的CONCAT()函数:轻松拼接字符串的利器

    这篇文章主要介绍了MySQL中的CONCAT()函数:轻松拼接字符串的利器,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Mysql中的SQL约束Constraint有哪几种

    Mysql中的SQL约束Constraint有哪几种

    这篇文章主要介绍了Mysql中的SQL约束Constraint有哪几种,约束是为了使表中的数据有效,常见的约束有非空约束、唯一性约束、主键约束、外键约束、检查约束,需要的朋友可以参考下
    2024-01-01
  • mysql自联去重的一些笔记记录

    mysql自联去重的一些笔记记录

    这篇文章主要给大家介绍了关于mysql自联去重的一些笔记记录,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • MySQL和PolarDB的相同点及不同点解读

    MySQL和PolarDB的相同点及不同点解读

    这篇文章主要介绍了MySQL和PolarDB的相同点及不同点,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • mysql出现“Incorrect key file for table”处理方法

    mysql出现“Incorrect key file for table”处理方法

    今天在恢复一个客户数据的时候。发现了一贯问题。有多个表损坏了。因为都是直接把表复制进去的。然后就出现了这个问题问题
    2013-07-07
  • MySQL对数据表已有表进行分区表的实现

    MySQL对数据表已有表进行分区表的实现

    本文主要介绍对现有的一个表进行创建分区表,并把数据迁移到新表,可以按时间来分区,具有一定的参考价值,感兴趣的可以了解一下
    2021-10-10
  • MySQL如何防止SQL注入并过滤SQL中注入的字符

    MySQL如何防止SQL注入并过滤SQL中注入的字符

    SQL注入是指在输入参数中添加一些特殊字符(例如单引号),使输入的语句成为一段单独的可执行的SQL语句,这篇文章主要给大家介绍了关于MySQL如何防止SQL注入并过滤SQL中注入字符的相关资料,需要的朋友可以参考下
    2024-02-02
  • MySQL千万级数据从190秒优化到1秒的全过程

    MySQL千万级数据从190秒优化到1秒的全过程

    优化MySQL千万级数据策略还是比较多的,分表分库,创建中间表,汇总表以及修改为多个子查询,这里讨论的情况是在MySQL一张表的数据达到千万级别,在这样的情况下,开发者可以尝试通过优化SQL来达到查询的目的,所以本文给大家介绍了MySQL千万级数据从190秒优化到1秒的全过程
    2024-04-04
  • MySQL关系型数据库事务的ACID特性与实现

    MySQL关系型数据库事务的ACID特性与实现

    这篇文章主要介绍了MySQL关系型数据库事务的ACID特性与实现,ACID 是为保证事务transaction是正确可靠的,具备原子性、一致性、隔离性、持久性等特性
    2022-07-07
  • mysql如何根据.frm和.ibd文件恢复数据表

    mysql如何根据.frm和.ibd文件恢复数据表

    这篇文章主要介绍了mysql根据.frm和.ibd文件恢复数据表的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论