首页 > 数据库 >MySQL Update语句一个非常经典的“坑”

MySQL Update语句一个非常经典的“坑”

时间:2023-12-14 09:11:22浏览次数:36  
标签:语句 code name Update update 李四 MySQL owner

起因

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

 

问题归纳起来就是:在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!

http://tech.dianwoda.com

标签:语句,code,name,Update,update,李四,MySQL,owner
From: https://www.cnblogs.com/ataoxz/p/17900427.html

相关文章

  • 【SpringBootWeb入门-12】MySQL-DDL-图形化工具
    1、章节前言上一篇文章我们讲解了MySQL的安装与配置,以及相关sql命令的执行操作,在演示这些sql语句的时候,我们都是在命令行当中进行操作的,在命令行当中敲写语句很不方便,主要原因有以下几点:无提示:命令行当中输入任何sql语句没有任何提示,全凭记忆,而且很容易敲错代码;操作繁琐:全部的......
  • mysql审计之插件MariaDB Audit Plugin
    一、概述审计插件是包含在MariaDB中的,所以需要先下载MariaDB然后将server_audit.so审计插件copy出来。MariaDB的10.1版本对应与Oracle的MySQL5.7版本,这里是MariaDB官方下载地址可以从链接里下载MariaDB我做实验使用的版本是8.0.25MariaDB并不兼容mysql5.7......
  • GO TCP代理(可代理SQLSERVER\MYSQL\ORCALE)
    用nginx代理不知道为什么内网能用,外网用不了,改用go写个代理临时用下,直接上代码 packagemainimport( "fmt" "io" "log" "net")varaddrstring="0.0.0.0:51415"//代理服务端口vardest_addrstring="192.168.2.120:1433"//目标地址......
  • MySQL和sqlite的区别
    存储方式MySQL:是一个服务器端的数据库系统,通常运行在一个独立的服务器上。数据存储在服务器的硬盘上。SQLite:是一个嵌入式数据库,通常用于移动应用和桌面应用。数据存储在一个单一的文件中。并发支持MySQL:支持高并发,适用于大型、多用户的应用。SQLite:并发支持较弱,更适用于......
  • MYSQL常用函数
    MYSQL常用函数1.数值函数函数功能ABS(x)返回数值x的绝对值MOD(x,y)返回数值x除以数值y后的余数CEIL(x)返回大于数值x的最小整数值FLOOR(x)返回小于数值x的最大整数值RAND()返回0~1内的随机数ROUND(x)返回对参数x进行四舍五入后的值,ROUND(x)返回......
  • JavaWeb - Day06 -MySQL-DDL、DML
    01.MySQL-课程介绍什么是数据库?数据库:英文为DataBase,简称DB,它是存储和管理数据的仓库。像我们日常访问的电商网站京东,企业内部的管理系统OA、ERP、CRM这类的系统,以及大家每天都会刷的头条、抖音类的app,那这些大家所看到的数据,其实都是存储在数据库中的。最终这些数据,只是在......
  • 【Python爬虫】Scrapy框架文件写入方式CSV,MYSQL,MongoDB_爬取新浪彩票双色球
    Spider代码爬取新浪彩票双色球页面数据,只爬取期号、红球、篮球classShuangseqiu11Spider(scrapy.Spider):name="shuangseqiu11"allowed_domains=["sina.com.cn"]start_urls=["https://view.lottery.sina.com.cn/lotto/pc_zst/index?lottoType=ssq&......
  • 使用 npm-check-updates 检查项目的 npm 依赖项是否有更新
    一、安装npm-check-updates:npminstall-gnpm-check-updates二、使用:在项目根目录运行以下命令,检查所有项目依赖项的最新版本:ncu执行结果如下:红色=主要升级青色=小幅升级绿色=补丁升级更新版本:ncu-u注意备份或者提交代码,确保包文件处于版本控制......
  • 无涯教程-Java - 嵌套 if 语句函数
    nestedif-else嵌套语句这意味着您可以在另一个iforelseif语句中使用一个iforelseif语句。nestedif-语法if(Boolean_expression1){//当布尔表达式1为true时执行if(Boolean_expression2){//当布尔表达式2为true时执行}}nestedif-示例......
  • mysql花式操作数据小技巧总结
    mysql花式操作数据小结本文是一片关于一些mysql小技巧的总结。主要内容包括:字段中包含多值、基于字段中某个值查询、基于身份证设置性别、身份证生成出生日期、增加表字段、一次搞定多个查询、关联删除、通过关系表一对多查询合并到一条记录、替代like1.字段中包含多值字段为cro......