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

測試數據

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這條尾巴。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM