亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

江门市| 旬阳县| 南华县| 砀山县| 开平市| 界首市| 房产| 南涧| 梓潼县| 涟水县| 南投市| 东安县| 威宁| 天峨县| 彭泽县| 永德县| 句容市| 益阳市| 贵州省| 罗平县| 陆良县| 浦北县| 屏山县| 合川市| 宝兴县| 五莲县| SHOW| 灵寿县| 饶阳县| 芜湖县| 基隆市| 民勤县| 安乡县| 汽车| 红原县| 福建省| 富锦市| 清远市| 龙海市| 崇阳县| 刚察县|