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

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

时间:2024-01-23 21:44:21浏览次数:35  
标签:语句 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/shujuyr/p/17983476

相关文章

  • C# Break 和 Continue 语句以及数组详解
    C#Break它被用于“跳出”switch语句。break语句也可用于跳出循环。以下示例在i等于4时跳出循环:示例:for(inti=0;i<10;i++){if(i==4){break;}Console.WriteLine(i);}C#Continuecontinue语句在循环中发生特定条件时中断一次迭代,并......
  • MySQL Cluster与Replication
    1、综述  MySql架构可以分为两种形式,一个是MySQLCluster,一个是MySQLReplication,Cluster即集群模式,Replication即主从复制(读写分离)模式。  MySQLCluster基于NDB存储引擎,其优点是高可用(即节点出现故障时自动切换到备用节点)和高可伸缩性(可以添加或删除节点以提高系统扩展性......
  • mysqlbinlog~导出sql总结
    mysqlbinlog是MySQL数据库中的一个实用程序,它用于处理二进制日志文件(也称为“binlogs”)。这些文件包含了在MySQL服务器上发生的所有更改和操作的信息。mysqlbinlog工具可以帮助你查看、分析或者应用这些日志。基础介绍下面是一些关于mysqlbinlog的基本介绍:功能查看二进制日志......
  • Java resultset判断mysql表是否存在
    importjava.sql.*;publicclassCheckTableExistence{publicstaticvoidmain(String[]args)throwsSQLException{Stringurl="jdbc:mysql://localhost:3306/mydatabase";//MySQL服务器地址及数据库名称Stringusername="root"......
  • mysql patition by--分区函数
    分区函数patitionbygroupby是分组函数,partitionby是分区函数partitionby并没有groupby的汇总功能。partitionby统计的每一条记录都存在,而groupby将所有的记录汇总成一条记录(类似于distinctEmpDepartment去重)相同点:groupby后的聚合函数,partionby后的orderby......
  • Ubuntu 安装 MySQL
    安装aptinstallmysql-server卸载aptremovemysql-server1、sudoaptpurgemysql-*2、sudorm-rf/etc/mysql//var/lib/mysql3、sudoaptautoremove4、sudoaptautoreclean重要:Mysql5.7.x及以上的版本可能没有初始密码,直接输入:mysql-uroot就直接进入mys......
  • 各版本 MySQL 并行复制的实现及优缺点
    MySQL并行复制已经是老生常谈,笔者从2010年开始就着手处理线上这个问题,刚开始两三年也乐此不疲分享,现在再提这个话题本来是难免“炒冷饭”嫌疑。最近触发再谈这个话题,是因为有些同学觉得“5.7的并行复制终于彻底解决了复制并发性问题”,感觉还是有必要分析一下。大家都说没有银弹,但......
  • MySQL密码过期策略
    如果要设置密码永不过期的全局策略,可以这样:(注意这是默认值,配置文件中可以不声明)[mysqld]default_password_lifetime=0禁用密码过期:ALTERUSER'testuser'@'localhost'PASSWORDEXPIRENEVER;......
  • 一台MySQL服务器启动多个端口
    一台MySQL服务器启动多个端口在测试Mysql多主一从服务器,即一个从服务器多端口同步不同主库。本文记录了开启不同端口的操作。详细步骤:1、首先要先把my.cnf配置文件复制一份,开几个端口要复制几份当然要重新命名.如:cp/etc/my.cnf/etc/my3306.cnfcp/etc/my.cnf/etc/my3307.cn......
  • 使用KeepAlived搭建MySQL高可用环境
     使用KeepAlived搭建MySQL的高可用环境。首先搭建MySQL的主从复制在Master开启binlog,创建复制帐号,然后在Slave输入命令 2016年7月25日 配置安装技巧: 1,使用yuminstall安装keepAlived  2,安装完后,配置/etc/keepalived/keepalived.conf配置文件,一开始配置名字取错了,老有......