在日常开发中由于业务逻辑较为复杂,常常需要用到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

测试数据

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)

  执行结果

(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  1   999
2   2   1000
3   3   1024
4   4
5   5
6   6
7   7

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

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);

  执行结果

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

  执行后的数据

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这条尾巴。

mysql update case when和where之间的注意事项相关推荐

  1. update case when 多字段,多条件, mysql中case when用法

    文章目录 前言 sql示例 普通写法: update case when写法 update case when 多字段写法 case when语法 case when 的坑 1.不符合case whe ...

  2. mysql 条件触发器_具有条件的MySQL更新触发器(MySQL Update Trigger with Conditions)

    具有条件的MySQL更新触发器(MySQL Update Trigger with Conditions) 我有一个PHP应用程序,通过TEST15将'Pass','Fail'或'NA'插入到字段TE ...

  3. mysql关于case when的用法举例

    原文链接:http://www.cnblogs.com/clphp/p/6256207.html Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数  CASE sex  ...

  4. mysql update 多表更新_MySQL UPDATE多表关联更新

    MySQL 可以基于多表查询更新数据.对于多表的 UPDATE 操作需要慎重,建议在更新前,先使用 SELECT 语句查询验证更新的数据与自己期望的是否一致. 下面我们建两张表,一张表为 produc ...

  5. MySQL UPDATE多表关联更新

    MySQL 可以基于多表查询更新数据.对于多表的 UPDATE 操作需要慎重,建议在更新前,先使用 SELECT 语句查询验证更新的数据与自己期望的是否一致. 下面我们建两张表,一张表为 produc ...

  6. mysql update w3c_PHP MySQL Update

    PHP MySQL Update 对于 MySQL 数据库中的数据你可以根据需要进行更新! UPDATE 语句用于中修改数据库表中的数据. 更新数据库中的数据 UPDATE 语句用于更新数据库表中已存 ...

  7. mysql set 子表,mysql update set 更新表数据

    1.update ...set...where... 题目:修改students id=2的name为"yanxia" mysql>update  students  set ...

  8. PHP MySQL Update

    PHP MySQL Update UPDATE 语句用于中修改数据库表中的数据. 更新数据库中的数据 UPDATE 语句用于更新数据库表中已存在的记录. 语法 UPDATE table_name SE ...

  9. mysql菜鸟教程update_PHP MySQL Update

    PHP MySQL Update UPDATE 语句用于中修改数据库表中的数据. 更新数据库中的数据 UPDATE 语句用于更新数据库表中已存在的记录. 语法 UPDATE table_name SE ...

最新文章

  1. PriorityBlockingQueue详解
  2. wife信号服务器可以改吗,不换无线路由器 该怎么提升WiFi信号
  3. Visual Basic中实现带预览的对话框
  4. SpringBoot自定义MessageConverter
  5. linux 下 apache启动、停止、重启命令
  6. 为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_【论文研读】路径规划中的Hybrid A*算法...
  7. 接口 java性能_接口测试性能测试
  8. 关于在Visual Studio 2019预览版中的用户体验和界面的变化
  9. matlab采样序列幅频特性,数字信号处理课设计指导书20130530.doc
  10. 诺基亚首款5G手机正式发布!还有Nokia 5310经典再现
  11. 如何在github上下载某个项目的单独某个目录
  12. python numpy逆_关于python:为什么numpy和scipy中的矩阵求逆函数对于大的二次矩阵返回不同的结果?...
  13. 12-17 学习记录
  14. kali怎么进入root用户_ubuntu系统密码忘了怎么办(root或一般用户)
  15. 微控制器MCU四大平台你了解多少?(一)
  16. 用于无人驾驶技术的车道线_自动驾驶汽车可用于查找车道的4种技术
  17. 手机开机显示设备服务器信息,原 live-server启动一个本地服务器(手机访问)
  18. css绘制卡券优惠券_如何使用css创建一个优惠券
  19. SPIR-V 研究:编译器基本原理(二)
  20. 代码质量检查规则中的 is provided externally to the method and not sanitized b.

热门文章

  1. 开课吧课堂之如何使用多重catch语句
  2. 解决asp.net中使用FckEditor上传文件,中文名称乱码的问题
  3. Oracle 冷备份详解【实战案例】
  4. Hive2.1.1执行initSchema报错
  5. 工作总结 @{var sas = String.Format({0:yyyy-MM-dd}, Model.DemandTime.GetValueOrDefault());}
  6. border_mode
  7. 在Microsoft-IIS/10.0上面部署mvc站点的时候,出现404的错误
  8. mysql “Access denied for user 'root'@'localhost'
  9. 剑指offer——面试题6:重建二叉树
  10. tensorflow获取可用GPU设备