記一次批次更新整型型別的列 → 探究 UPDATE 的使用細節

2022-09-27 12:01:09

開心一刻

  今天,她給我打來電話

  她:你明天陪我去趟醫院吧

  我:怎麼了

  她:我懷孕了,陪我去打胎

  我:他的嗎

  她:嗯

  我心一沉,猶豫了片刻:生下來吧,我養!

  她:他的孩子,你不配養!

  我:我隨孩子姓

  我們來看實際案例

  表 tbl_batch_update 

  資料如下

  執行效果如下

  更嚴謹點

 

  該如何實現?  UPDATE 是不是也支援 ORDER BY ?

  還真支援,如下所示

 

   是不是有很多疑問:

  多表語法

  相比於單表,貌似更簡單一些,不支援 ORDER BY 和  LIMIT 

  LOW_PRIORITY

   UPDATE 的修飾符之一,用來降低 SQL 的優先順序

  當使用 LOW_PRIORITY 之後, UPDATE 的執行將會被延遲,直到沒有其他使用者端從表中讀取資料為止

  但是,只有表級鎖的儲存引擎才支援 LOW_PRIORITY ,表級鎖的儲存引擎包括: MyISAM 、 MEMORY 和 MERGE ,所以最常用的 InnoDB 是不支援的

  使用場景很少,混個眼熟就好

  IGNORE

   UPDATE 的修飾符之一,用來宣告 SQL 執行時發生錯誤的處理方式

  如果沒有使用 IGNORE , UPDATE 執行時如果發生錯誤會中止,如下所示

  LIMIT

   LIMIT row_count 子句是行匹配限制。一旦找到滿足 WHERE 子句的 row_count 行,無論這些行是否實際更改,該語句都會立即停止

  也是就說 LIMIT 限制的是 查階段 ,與 更新階段 沒有關係

  還是有區別的

  value DEFAULT

   UPDATE 中 SET 子句的 value 是表示式,我們可以理解,這個 DEFAULT 是什麼意思?

  我們先來看這麼一個問題,假設某列被宣告了 NOT NULL ,然而我們更新這列成 NULL 

  會發生什麼

 

 

   我們看下 SQL_MODE ,執行 SELECT @@sql_mode; 得到結果

   STRICT_TRANS_TABLES 表明啟動了嚴格模式,對 INSERT 和 UPDATE 語句的 value 管控會更嚴格

  如果我們關閉嚴格模式,再看看執行結果

  想必大家都很清楚

  然而,以下 SQL 中的 name 列的值會是多少

  我們來看下結果

   name 的值是不是和預想的有點不一樣?

  單表 UPDATE 的 SET 是從左往右進行的,然而多表 UPDATE 卻不是,多表 UPDATE 不能保證按任何特定順序進行

總結

  1、不管是 UPDATE ,還是 DELETE ,都有一個先查的過程,查到一行處理一行

  2、 UPDATE 語法中的 LOW_PRIORITY 很少用, IGNORE 偶爾用, ORDER BY 和 LIMIT 相對會用的多一點,都混個眼熟

  3、 sql_mode 是比較重要的知識點,推薦大家掌握;生產環境,強烈推薦開啟嚴格模式

參考

  UPDATE Statement