1. 程式人生 > 資料庫 >mysql利用引數sql_safe_updates限制update/delete範圍詳解

mysql利用引數sql_safe_updates限制update/delete範圍詳解

前言

大家應該都知道,我們在mysql運維中出現過不少因為update/delete條件錯誤導致資料被誤更新或者刪除的case,為避免類似問題的發生,可以用sql_safe_updates引數來對update/delete做限制。這個引數設定為on後,可防止因程式bug或者DBA手工誤操作導致的整個表被更新或者刪除的情況。下面話不多說了,來一起看看詳細的介紹吧。

設定這個引數時需要注意一下幾點:

a、設定前需要確認程式中所有的update和delete都符合sql_safe_updates的限制規範,不然程式會報錯。

b、5.0,5.1都是session級別的,5.6是global&session級別;低版本的資料庫只能在程式建立session時設定帶上set sql_safe_updates=on;

高版本的資料庫可以直接set global set sql_safe_updates=on,設定完成後讓程式重連後生效。

限制規範:

示例表結構:

CREATE TABLE `delay_monitor` (
 `id` int(11) NOT NULL,`Ftime` datetime DEFAULT NULL,`Fgtid` varchar(128) NOT NULL DEFAULT '',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin​

1、update

a、報錯條件:不帶where、帶where無索引、where條件為常量

不帶where:update delay_monitor set Ftime=now();

帶where無索引:update delay_monitor set Ftime=now() where Fgtid='test';

where條件為常量:update delay_monitor set Ftime=now() where 1;

b、執行條件:帶where帶索引、不帶where+帶limit、帶where無索引+limit、帶where有索引+limit、where條件為常量+limit

帶where帶索引:update delay_monitor set Ftime=now() where id=2;

不帶where+帶limit: update delay_monitor set Ftime=now() limit 1;

帶where無索引+limit:update delay_monitor set Ftime=now() where Fgtid='test' limit 1;

帶where有索引+limit:update delay_monitor set Ftime=now() where id =2 limit1;

where條件為常量+limit:update delay_monitor set Ftime=now() where 1 limit 1;

2、delete

相對於update,delelte的限制會更為嚴格;where條件為常量或者為空,將不予執行。

a、報錯條件:不帶where、帶where無索引、不帶where+帶limit、where條件為常量、where條件為常量+limit

不帶where:delete delay_monitor set Ftime=now();

帶where無索引:delete delay_monitor set Ftime=now() where Fgtid='test';

不帶where+帶limit: delete delay_monitor set Ftime=now() limit 1;

where條件為常量:delete delay_monitor set Ftime=now() where 1;

where條件為常量+limit:delete delay_monitor set Ftime=now() where 1 limit 1;

b、執行條件:帶where帶索引、帶where無索引+limit、帶where有索引+limt

帶where帶索引:delete delay_monitor set Ftime=now() where id=2;

帶where無索引+limit:delete delay_monitor set Ftime=now() where Fgtid='test' limit 1;

帶where有索引+limit:delete delay_monitor set Ftime=now() where id =2 limit1;

總結如下表:key表示所有、const表示常量

操作 no where where key where nokey limit where nokey+limit where key+limit where const where const+limit
delete NO YES NO NO YES YES NO NO
update NO YES NO YES YES YES NO YES

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。