當我們在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