中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中參數sql_safe_updates在生產環境怎么用

發布時間:2021-07-29 10:32:28 來源:億速云 閱讀:140 作者:小新 欄目:MySQL數據庫

這篇文章主要介紹了MySQL中參數sql_safe_updates在生產環境怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言

在應用 BUG或者 DBA誤操作的情況下,會發生對全表進行更新:update delete 的情況。MySQL提供 sql_safe_updates 來限制次操作。

set sql_safe_updates = 1;

設置之后,會限制update delete 中不帶 where 條件的SQL 執行,較嚴格。會對已有線上環境帶來不利影響。對新系統、應用做嚴格審核,可以確保不會發生全表更新的問題。

CREATE TABLE working.test01 (id INT NOT NULL AUTO_INCREMENT,NAME VARCHAR(20),age INT,gmt_created DATETIME,PRIMARY KEY(id));

 insert into test01(name,age,gmt_created) values('xiaowang',2,now());
 insert into test01(name,age,gmt_created) values('huahua',5,now()); 
 insert into test01(name,age,gmt_created) values('gougou',9,now()); 
 insert into test01(name,age,gmt_created) values('heihei',12,now()); 
 insert into test01(name,age,gmt_created) values('baibai',134,now()); 

# 過濾字段上沒有索引
update
update test01 set name = 'xiaoxiao' where age = 2 ;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
# 全表更新
update test01 set name = 'xiaoxiao';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
# 加入limit的更新
update test01 set name = 'xia' limit 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

# 新增索引
create index idx_age on test01(age);

update test01 set name = 'xiaoxiao' where age = 2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

update test01 set name = 'hhh' where age = 9 limit 10;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

alter table test01 drop index idx_age;
create index idx_age_name on test01(age,name);


update test01 set age= 100 where name = 'hhh';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

update test01 set age= 100 where name = 'hhh' limit 10;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

由此,update 時,在沒有 where 條件或者where 后不是索引字段時,必須使用 limit ;在有 where 條件時,為索引字段

最近在工作中又發現了一個問題,mysql sql_safe_updates 不支持子查詢的更新。

考慮到開發人員有時候不小心誤更新數據,要求線上庫的 MySQL 實例都設置 sql_safe_updates=1 來避免沒有索引的 update、delete。

結果有一天開發發現下面的一個SQL 沒法正確執行:

update t1 set col2=1 where key1 in (select col2 from t2 where key2='ABcD');

錯誤如下:

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

也就是說沒法對沒有走到索引的where條件進行更新。搜索了下發現,的確不行。及時 key1 和key2 分別是 t1、t2 的索引[我換成主鍵都不行] 。說明是不支持子查詢的update。

google 了一下發現人家也問過這個問題。。

http://stackoverflow.com/questions/24314830/query-not-getting-executed-if-supplied-a-nested-sub-query

最后解決方法:

1)修改 session 級別的參數: set sql_safe_updates=0; 執行 update 操作。退出終端。

2)程序處理:先 select col2 from t2 where key2='ABcD' 獲取數據,然后循環處理結果,并用 update t1 set col2=1 where key1=? 來批量更新過。建議還是用程序處理,臨時修改變量不是長久之計。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“MySQL中參數sql_safe_updates在生產環境怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永宁县| 河源市| 达州市| 三都| 邮箱| 玉田县| 崇礼县| 精河县| 眉山市| 新化县| 寻乌县| 乌恰县| 镇远县| 陵水| 余干县| 江孜县| 克什克腾旗| 新龙县| 昌图县| 慈利县| 会泽县| 城口县| 宕昌县| 同心县| 塔城市| 手游| 曲沃县| 突泉县| 紫云| 呼图壁县| 西盟| 正宁县| 宁乡县| 永康市| 桃园市| 昭通市| 含山县| 安康市| 三原县| 武冈市| 科技|