最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL sql_safe_updates參數(shù)詳解

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

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

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

如何設(shè)置 sql_safe_updates

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

全局級別:

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

SET GLOBAL sql_safe_updates = 1;

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

會話級別:

你可以通過在你的 MySQL 會話中執(zhí)行以下 SQL 語句來設(shè)置 sql_safe_updates:

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

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

注意事項

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

(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 部署都會默認(rèn)啟用 sql_safe_updates。它通常是由數(shù)據(jù)庫管理員或開發(fā)者根據(jù)特定的安全要求來配置的。
  • 在某些情況下,你可能需要臨時禁用 sql_safe_updates 以執(zhí)行特定的批量更新或刪除操作。在這種情況下,你可以在會話級別設(shè)置 sql_safe_updates = 0,但請務(wù)必小心,確保你的 SQL 語句是安全的,不會意外地影響大量數(shù)據(jù)。

總之,sql_safe_updates 是一個有用的安全特性,可以幫助防止由于疏忽或錯誤導(dǎo)致的數(shù)據(jù)丟失。然而,它也要求開發(fā)者和數(shù)據(jù)庫管理員更加注意他們的 SQL 語句,以確保它們的安全性和準(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 時。

  • update 語句必須滿足如下條件之一才能執(zhí)行成功:
    • update 語句使用 where,并且 where 條件中必須有索引列;
    • update 語句使用 limit;
    • update 語句同時使用 where 和 limit,此時 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 語句必須滿足以下條件能執(zhí)行成功:
  • delete 語句同時使用 where 條件中帶有索引列
  • delete 語句同時使用 where 條件中帶有索引列 及 limit
  • delete 語句同時使用 where 和 limit,此時 where 條件中可以不帶有索引列;
(root@localhost)[superdb]> insert into dept values(50,'sz','hk');
Query OK, 1 row affected (0.01 sec)
-- 同時使用 where 和 limit,此時 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不是索引列,因此無法刪除操作
(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. 
-- 同時使用 where 和 limit,此時 where 條件中沒有索引列
(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)化器使用哪個索引,以此避免有幾率鎖全表帶來的隱患。

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

相關(guān)文章

  • mysql?timestamp字段規(guī)范使用詳情

    mysql?timestamp字段規(guī)范使用詳情

    這篇文章主要介紹了mysql?timestamp字段規(guī)范使用詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • MySql中怎樣查詢表是否被鎖

    MySql中怎樣查詢表是否被鎖

    這篇文章主要介紹了MySql中怎樣查詢表是否被鎖問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • mysql設(shè)置默認(rèn)值無效問題及解決

    mysql設(shè)置默認(rèn)值無效問題及解決

    這篇文章主要介紹了mysql設(shè)置默認(rèn)值無效問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • MYSQL 修改root密碼命令小結(jié)

    MYSQL 修改root密碼命令小結(jié)

    MYSQL 修改root密碼命令小結(jié),需要的朋友可以參考下。
    2011-10-10
  • Mysql事務(wù)與存儲引擎全解(概念、原理、代碼示例)

    Mysql事務(wù)與存儲引擎全解(概念、原理、代碼示例)

    本文講解了MySQL事務(wù)與存儲引擎的相關(guān)知識點,圍繞圖片中的知識點,從概念、原理、代碼示例三個維度,帶你徹底掌握 MySQL 事務(wù)與存儲引擎,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • MySQL通透詳解架構(gòu)設(shè)計

    MySQL通透詳解架構(gòu)設(shè)計

    這篇文章主要介紹了MySQL架構(gòu)設(shè)計相關(guān)基礎(chǔ)與原則,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2022-02-02
  • MyISAM和InnoDB引擎優(yōu)化分析

    MyISAM和InnoDB引擎優(yōu)化分析

    這幾天在學(xué)習(xí)mysql數(shù)據(jù)庫的優(yōu)化并在自己的服務(wù)器上進(jìn)行設(shè)置,喻名堂主要學(xué)習(xí)了MyISAM和InnoDB兩種引擎的優(yōu)化方法,需要了解跟多的朋友可以參考下
    2012-11-11
  • 手把手帶你徹底卸載MySQL數(shù)據(jù)庫

    手把手帶你徹底卸載MySQL數(shù)據(jù)庫

    相信大家都因為各種各樣的原因可能需要卸載MySQL或者卸載重裝,但是如果MySQL不能清理干凈的話是很容易出現(xiàn)問題的,這篇文章主要給大家介紹了關(guān)于如何徹底卸載MySQL數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Mysql優(yōu)化技巧之Limit查詢的優(yōu)化分析

    Mysql優(yōu)化技巧之Limit查詢的優(yōu)化分析

    這篇文章主要給大家介紹了關(guān)于Mysql優(yōu)化技巧之Limit查詢的優(yōu)化分析,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Mysql中mvcc各場景理解應(yīng)用

    Mysql中mvcc各場景理解應(yīng)用

    這篇文章主要為大家介紹了Mysql中mvcc各場景理解應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評論

马鞍山市| 西丰县| 高淳县| 阆中市| 贡觉县| 开远市| 罗甸县| 德州市| 象州县| 内丘县| 浮梁县| 郓城县| 贵德县| 堆龙德庆县| 拉萨市| 洪雅县| 谷城县| 仁寿县| 新丰县| 温州市| 多伦县| 遂溪县| 泸州市| 松江区| 天柱县| 梁平县| 正阳县| 永仁县| 沙洋县| 拉萨市| 彭阳县| 司法| 肇源县| 东阿县| 囊谦县| 库尔勒市| 颍上县| 黄浦区| 曲周县| 公安县| 遵化市|