mysql update case when和where之间的注意事项

简介:

在日常开发中由于业务逻辑较为复杂,常常需要用到UPDATE和CASE...WHEN...THEN...ELSE...END一起做一些复杂的更新。有时候因为对这几个字句理解得不透彻会带来很大的困扰。因此对UPDATE和CASE WHEN结构的特性做进一步的测试。

  CASE WHEN的两种写法:
Type 1: CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
Type 2: CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

结论:
在第一个方案的返回结果中,value=compare-value.而第二个方案的返回结果是第一种情况的真实结果.
    如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为NULL,如果字段为NOT NULL则会根据不同数据类型返回不同的值(字符串类型时返回空字符串,数值类型时返回0,其它类型未做测试).

注意:如果CASE...WHEN...THEN...END没有WHERE字句的话会将相应表的记录遍历一遍。

创建测试表

CREATE TABLE `goods` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `type` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

测试数据

1
2
3
4
5
6
7
8
id  name  type
1    1    1
2    2    1
3    3    2
4    4    2
5    5    3
6    6    3
7    7    4
  • 没有WHERE字句时会遍历所有记录
UPDATE `goods` SET `type` = (
    CASE `name` WHEN 1 THEN 999  
    WHEN 2 THEN 1000  
    WHEN 3 THEN 1024  
    END)

  执行结果

1
2
3
4
(7 row(s) affected, 4 warning(s))
Execution  Time  : 00:00:00:000
Transfer  Time   : 00:00:00:047
Total  Time      : 00:00:00:047

  type为字符串时返回空字符串,执行后的数据

1
2
3
4
5
6
7
1   1   999
2   2   1000
3   3   1024
4   4  
5   5  
6   6  
7   7  

  type为整形时返回0,执行后的数据

1
2
3
4
5
6
7
1   1   999
2   2   1000
3   3   1024
4   4   0
5   5   0
6   6   0
7   7   0
  • 添加where字句
UPDATE `goods` SET `type` = (
    CASE `name` WHEN 1 THEN 999  
    WHEN 2 THEN 1000  
    WHEN 3 THEN 1024  
    END)
WHERE ID in(1, 2, 3);

  执行结果

1
2
3
4
(3 row(s) affected)
Execution  Time  : 00:00:00:000
Transfer  Time   : 00:00:00:016
Total  Time      : 00:00:00:016

  执行后的数据

1
2
3
4
5
6
7
1   1   999
2   2   1000
3   3   1024
4   4   4
5   5   5
6   6   6
7   7   7

  由此可见,做UPDATE时WHERE字句是多么的重要。做UPDATE更新时请时刻记住WHERE这条尾巴。






本文转自秋楓博客园博客,原文链接:http://www.cnblogs.com/rwxwsblog/p/4512061.html,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
存储 SQL NoSQL
|
SQL 关系型数据库 MySQL
MySQL中的 where 1=1会不会影响性能?看完官方文档就悟了!
本文探讨了在Mybatis中使用`where 1=1`进行动态SQL拼接是否会影响性能。通过MySQL官方资料和实际测试表明,`where 1=1`在MySQL 5.7及以上版本中会被优化器优化,因此对性能影响不大。文中详细对比了`where 1=1`与`<where>`标签的使用方法,并建议根据MySQL版本和团队需求选择合适的方式。最后,推荐查找官方资料以确保技术路线正确。
295 4
|
SQL 关系型数据库 MySQL
mysql 中 case when 的使用
mysql 中 case when 的使用
|
SQL 关系型数据库 MySQL
MySQL异常一之: You can‘t specify target table for update in FROM clause解决办法
这篇文章介绍了如何解决MySQL中“不能在FROM子句中指定更新的目标表”(You can't specify target table for update in FROM clause)的错误,提供了错误描述、需求说明、错误做法和正确的SQL写法。
2495 0
|
存储 关系型数据库 MySQL
MySQL 字符字段长度设置详解:语法、注意事项和示例
MySQL 字符字段长度设置详解:语法、注意事项和示例
1103 0
|
存储 SQL 关系型数据库
MySQL中的update操作与锁机制
本文探讨MySQL中`UPDATE`操作的自动加锁机制及其对数据一致性的保障作用。尤其在InnoDB存储引擎下,系统会在涉及索引的更新操作中加行锁或间隙锁,防止多事务并发修改同一条记录。通过福利码兑换系统的实例展示,当线程A开启事务更新库存时,线程B试图更新相同记录会被阻塞,直至线程A提交。此外,文章还介绍了乐观锁及版本号控制等策略进一步提升并发性能的方法。作者:小明爱吃火锅,来源:稀土掘金。
726 2
|
负载均衡 关系型数据库 MySQL
MySQL PXC集群多个节点同时大量并发update同一行
如本文标题,MySQL PXC集群多个节点同时大量并发update同一行数据,会怎样? 为此,本人做了一个测试,来验证到底会怎样!
188 0
|
关系型数据库 MySQL Java
软件开发2003 -Can·t to MySQL server on ‘xxxxxx‘(10038),宝塔初始化安装mysql,远程链接MySql注意事项,开始时服务器是没有放开端口的,宝塔也都开
软件开发2003 -Can·t to MySQL server on ‘xxxxxx‘(10038),宝塔初始化安装mysql,远程链接MySql注意事项,开始时服务器是没有放开端口的,宝塔也都开
|
存储 关系型数据库 MySQL
MySQL删除索引的方法与注意事项
MySQL删除索引的方法与注意事项
1859 0
|
供应链 关系型数据库 MySQL
MySQL的`FOR UPDATE`详解
MySQL的`FOR UPDATE`详解
1051 0

推荐镜像

更多