欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL sql_safe_updates參數(shù)詳解

 更新時(shí)間:2024年07月11日 11:18:02   作者:zxrhhm  
sql_safe_updates 是 MySQL 中的一個(gè)系統(tǒng)變量,用于控制 MySQL 服務(wù)器是否允許在沒(méi)有使用 KEY 或 LIMIT 子句的 UPDATE 或 DELETE 語(yǔ)句上執(zhí)行更新或刪除操作,這篇文章主要介紹了MySQL sql_safe_updates參數(shù),需要的朋友可以參考下

sql_safe_updates 是 MySQL 中的一個(gè)系統(tǒng)變量,用于控制 MySQL 服務(wù)器是否允許在沒(méi)有使用 KEY 或 LIMIT 子句的 UPDATE 或 DELETE 語(yǔ)句上執(zhí)行更新或刪除操作。當(dāng)這個(gè)變量被設(shè)置為 ON 時(shí),MySQL 會(huì)拒絕那些可能影響到表中大量行的 UPDATE 或 DELETE 語(yǔ)句,除非這些語(yǔ)句明確使用了 WHERE 子句中的 KEY(如主鍵或唯一索引)或者 LIMIT 子句來(lái)限制影響的行數(shù)。

這樣做的目的是為了防止由于疏忽或錯(cuò)誤編寫的 SQL 語(yǔ)句而導(dǎo)致大量數(shù)據(jù)的意外丟失或修改。

如何設(shè)置 sql_safe_updates

你可以通過(guò)幾種方式設(shè)置 sql_safe_updates:

全局級(jí)別:

你可以通過(guò)修改 MySQL 的配置文件(如 my.cnf 或 my.ini,取決于你的操作系統(tǒng)和 MySQL 版本)來(lái)永久設(shè)置這個(gè)變量。但是,請(qǐng)注意,直接在配置文件中設(shè)置 sql_safe_updates 可能不被所有 MySQL 版本支持,或者可能需要以不同的方式配置(如通過(guò)插件或其他系統(tǒng)變量)。
一種更常見(jiàn)的方法是使用 MySQL 的 SET GLOBAL 語(yǔ)句在運(yùn)行時(shí)設(shè)置它,但這只會(huì)影響新的連接。例如:

SET GLOBAL sql_safe_updates = 1;

但是,請(qǐng)注意,直接設(shè)置全局變量可能需要管理員權(quán)限,并且這個(gè)更改不會(huì)影響已經(jīng)存在的會(huì)話。

會(huì)話級(jí)別:

你可以通過(guò)在你的 MySQL 會(huì)話中執(zhí)行以下 SQL 語(yǔ)句來(lái)設(shè)置 sql_safe_updates:

SET SESSION sql_safe_updates = 1;
或者登錄時(shí)加上--safe-updates 
mysql -uroot -p --safe-updates 

這會(huì)影響當(dāng)前會(huì)話中的后續(xù)操作,但不會(huì)影響到其他會(huì)話或全局設(shè)置。

注意事項(xiàng)

在啟用 sql_safe_updates 后,如果你嘗試執(zhí)行一個(gè)沒(méi)有 KEY 或 LIMIT 的 UPDATE 或 DELETE 語(yǔ)句,MySQL 將拒絕該操作并返回錯(cuò)誤。

(root@localhost)[superdb]> show index from dept;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| dept  |          0 | PRIMARY  |            1 | deptno      | A         |           4 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.13 sec)
(root@localhost)[superdb]> update dept set loc='sz';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. 
  • 并非所有 MySQL 部署都會(huì)默認(rèn)啟用 sql_safe_updates。它通常是由數(shù)據(jù)庫(kù)管理員或開(kāi)發(fā)者根據(jù)特定的安全要求來(lái)配置的。
  • 在某些情況下,你可能需要臨時(shí)禁用 sql_safe_updates 以執(zhí)行特定的批量更新或刪除操作。在這種情況下,你可以在會(huì)話級(jí)別設(shè)置 sql_safe_updates = 0,但請(qǐng)務(wù)必小心,確保你的 SQL 語(yǔ)句是安全的,不會(huì)意外地影響大量數(shù)據(jù)。

總之,sql_safe_updates 是一個(gè)有用的安全特性,可以幫助防止由于疏忽或錯(cuò)誤導(dǎo)致的數(shù)據(jù)丟失。然而,它也要求開(kāi)發(fā)者和數(shù)據(jù)庫(kù)管理員更加注意他們的 SQL 語(yǔ)句,以確保它們的安全性和準(zhǔn)確性。

官方解釋

If set to 1, MySQL aborts UPDATE or DELETE statements that do not use a key in the WHERE clause or a LIMIT clause. (Specifically, UPDATE statements must have a WHERE clause that uses a key or a LIMIT clause, or both. DELETE statements must have both.) This makes it possible to catch UPDATE or DELETE statements where keys are not used properly and that would probably change or delete a large number of rows. The default value is 0.

當(dāng) sql_safe_updates 設(shè)置為 1 時(shí)。

  • update 語(yǔ)句必須滿足如下條件之一才能執(zhí)行成功:
    • update 語(yǔ)句使用 where,并且 where 條件中必須有索引列;
    • update 語(yǔ)句使用 limit;
    • update 語(yǔ)句同時(shí)使用 where 和 limit,此時(shí) where 條件中可以不帶有索引列;
(root@localhost)[superdb]> update dept set loc='sz' limit 1;
Query OK, 1 row affected (0.10 sec)
Rows matched: 1  Changed: 1  Warnings: 0
(root@localhost)[superdb]> select * from dept;
+--------+------------+---------+
| deptno | dname      | loc     |
+--------+------------+---------+
|     10 | ACCOUNTING | sz      |
|     20 | RESEARCH   | DALLAS  |
|     30 | SALES      | CHICAGO |
|     40 | OPERATIONS | BOSTON  |
+--------+------------+---------+
4 rows in set (0.00 sec)
(root@localhost)[superdb]> update dept set loc='NEW YORK' limit 1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0
(root@localhost)[superdb]> update dept set loc='NEW YORK' where deptno=10;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
(root@localhost)[superdb]> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)
(root@localhost)[superdb]> update dept set loc='NEW YORK' where deptno=10 limit 2;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
(root@localhost)[superdb]> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)
  • delete 語(yǔ)句必須滿足以下條件能執(zhí)行成功:
  • delete 語(yǔ)句同時(shí)使用 where 條件中帶有索引列
  • delete 語(yǔ)句同時(shí)使用 where 條件中帶有索引列 及 limit
  • delete 語(yǔ)句同時(shí)使用 where 和 limit,此時(shí) where 條件中可以不帶有索引列;
(root@localhost)[superdb]> insert into dept values(50,'sz','hk');
Query OK, 1 row affected (0.01 sec)
-- 同時(shí)使用 where 和 limit,此時(shí) where 條件中可以有索引列
(root@localhost)[superdb]> delete from dept where deptno=50 limit 1;
Query OK, 1 row affected (0.00 sec)
(root@localhost)[superdb]> insert into dept values(50,'sz','hk');
Query OK, 1 row affected (0.00 sec)
-- 僅使用 where條件中是索引列
(root@localhost)[superdb]> delete from dept where deptno=50;
Query OK, 1 row affected (0.01 sec)
(root@localhost)[superdb]> insert into dept values(50,'sz','hk');
Query OK, 1 row affected (0.00 sec)
-- dname不是索引列,因此無(wú)法刪除操作
(root@localhost)[superdb]> delete from dept where dname='sz';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. 
-- 同時(shí)使用 where 和 limit,此時(shí) where 條件中沒(méi)有索引列
(root@localhost)[superdb]> delete from dept where dname='sz' limit 1;
Query OK, 1 row affected (0.05 sec)
(root@localhost)[superdb]> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)
(root@localhost)[superdb]> show index from dept;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| dept  |          0 | PRIMARY  |            1 | deptno      | A         |           4 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.13 sec)

如果 where 條件帶上了索引列,但是優(yōu)化器最終掃描選擇的是全表,而不是索引的話,我們可以使用 force index([index_name]) 可以告訴優(yōu)化器使用哪個(gè)索引,以此避免有幾率鎖全表帶來(lái)的隱患。

到此這篇關(guān)于MySQL sql_safe_updates參數(shù)的文章就介紹到這了,更多相關(guān)mysql sql_safe_updates參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql實(shí)現(xiàn)隨機(jī)查詢經(jīng)驗(yàn)談

    mysql實(shí)現(xiàn)隨機(jī)查詢經(jīng)驗(yàn)談

    官方文檔中進(jìn)行說(shuō)明:Order By和RAND()連用,會(huì)多次掃描表,導(dǎo)致速度變慢,下面看下一些測(cè)試詳解
    2013-10-10
  • Mysql離線安裝8.0.26的圖文教程

    Mysql離線安裝8.0.26的圖文教程

    這篇文章主要介紹了Mysql離線安裝8.0.26的圖文教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Mysql數(shù)據(jù)庫(kù)表中為什么有索引卻沒(méi)有提高查詢速度

    Mysql數(shù)據(jù)庫(kù)表中為什么有索引卻沒(méi)有提高查詢速度

    你有沒(méi)有想起過(guò)為什么明明再數(shù)據(jù)庫(kù)中有索引,但是查詢速度卻并沒(méi)有希望的那樣快?本篇文章將帶給你答案,跟小編一起看看吧
    2022-02-02
  • MySQL百萬(wàn)級(jí)數(shù)據(jù),怎樣做分頁(yè)查詢

    MySQL百萬(wàn)級(jí)數(shù)據(jù),怎樣做分頁(yè)查詢

    這篇文章主要介紹了MySQL百萬(wàn)級(jí)數(shù)據(jù),怎樣做分頁(yè)查詢?今天咱們就來(lái)聊聊這個(gè)話題,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • MySQL中order by的使用詳情

    MySQL中order by的使用詳情

    在使用select語(yǔ)句時(shí)可以結(jié)合order by對(duì)查詢的數(shù)據(jù)進(jìn)行排序。如果不使用order by默認(rèn)情況下MySQL返回的數(shù)據(jù)集,與它在底層表中的順序相同,可能與你添加數(shù)據(jù)到表中的順序一致,也可能不一致,如果希望得到的數(shù)據(jù)有順序,就該明確排序方式,下面詳細(xì)內(nèi)容需要的朋友可以參考一下
    2021-11-11
  • phplib中的一些基本語(yǔ)法和函數(shù)

    phplib中的一些基本語(yǔ)法和函數(shù)

    phplib中常用的方法有set_file,set_block,set_var,parse,ppasre,p,get等。
    2010-04-04
  • MySQL中sql_mode模式的使用

    MySQL中sql_mode模式的使用

    mysql為了支持在不同的環(huán)境下運(yùn)行,允許我們給它設(shè)置不同的運(yùn)行模式,本文主要介紹了MySQL中sql_mode模式的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • mysql慢查詢?nèi)罩据嗈D(zhuǎn)_MySQL慢查詢?nèi)罩緦?shí)操

    mysql慢查詢?nèi)罩据嗈D(zhuǎn)_MySQL慢查詢?nèi)罩緦?shí)操

    這篇文章主要介紹了mysql慢查詢?nèi)罩据嗈D(zhuǎn)_MySQL慢查詢?nèi)罩緦?shí)操,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • MySQL基礎(chǔ)教程第一篇 mysql5.7.18安裝和連接教程

    MySQL基礎(chǔ)教程第一篇 mysql5.7.18安裝和連接教程

    這篇文章主要為大家詳細(xì)介紹了MySQL基礎(chǔ)教程第一篇,mysql5.7.18安裝和連接教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • MySQL千萬(wàn)級(jí)大表進(jìn)行數(shù)據(jù)清理的幾種常見(jiàn)方案

    MySQL千萬(wàn)級(jí)大表進(jìn)行數(shù)據(jù)清理的幾種常見(jiàn)方案

    當(dāng)MySQL數(shù)據(jù)庫(kù)中的表數(shù)據(jù)量達(dá)到千萬(wàn)級(jí)別時(shí),直接對(duì)數(shù)據(jù)進(jìn)行刪除操作將面臨嚴(yán)重的性能問(wèn)題,可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)長(zhǎng)時(shí)間的鎖表,因此,如何安全高效地進(jìn)行數(shù)據(jù)清理成為一個(gè)亟需解決的問(wèn)題,下面我將分享幾種常見(jiàn)的數(shù)據(jù)清理方案,需要的朋友可以參考下
    2023-11-11

最新評(píng)論