【MySQL】解除安全更新模式(safe update mode)

當我們在MySQL中使用 UPDATE 要批次改變資料的作業,卻發生Error Code 1175錯誤,不讓我們修改。這是MySQL的安全措施,不要讓我們輕易的修改資料。
但,想要批次作業要怎麼解決呢?這時候SQL_SAFE_UPDATES就上場了!


運作環境;

  • MySQL Server: MySQL Community Server - GPL  Version: 8.0.17
  • MySQLWorkBench:Version: 8.0.17

 

當我們使用類似這樣的UPDATE語法-

UPDATE TRX_RECORDING  set CONTENT_CATEGORY="6e409b649fc043278b5139c55a28c09c";


會發生這樣的錯誤:

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.  To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.

 

這是在說,為了安全的更新(UPDATE)資料,需要我們設定WHERE條件,在WHERE條件式中增加KEY,這是確認我們是一筆一筆穩穩的更新,而不是不小心的批次更新。

 

但是我們就是要批次更新,就是需要使用SQL_SAFE_UPDATES=0。在預設的情況SQL_SAFE_UPDATES會是為「1」,為開啟狀態,當要批次作業時就要關閉它,因此設定為「0」,做完後,記得回覆成安全模式:

SET SQL_SAFE_UPDATES=0;


UPDATE TRX_RECORDING  set CONTENT_CATEGORY="6e409b649fc043278b5139c55a28c09c";


SET SQL_SAFE_UPDATES=1;

WHERE條件中,沒有KEY(primary key)時,也是需要使用SQL_SAFE_UPDATES=0

SET SQL_SAFE_UPDATES=0;


UPDATE customer c SET
c.CUSTOMER_ORDER_NO=
( CASE
    WHEN c.ACCOUNT IS NULL
        THEN ''
    WHEN c.CREATE_TIME < '2021-1-1'
        THEN CONCAT(c.OPENING_BRANCH_NO, LPAD(c.CUSTOMER_NO,6,"0"))
    ELSE 
        ''
 END
 )
WHERE c.CREATE_TIME <= '2021-1-1' AND c.CUSTOMER_ORDER_NO = '';


SET SQL_SAFE_UPDATES=1;

 

~Copyright by Eyelash500~

IT技術文章EY*研究院
iT邦幫忙eyelash*睫毛
Blog睫毛*Relax
Facebook睫毛*Relax