日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql sql_safe_updates 分析

發布時間:2025/3/13 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql sql_safe_updates 分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

排名前5的SQL悲劇中肯定有:

delete from table t /* where true */; update t set col='new_value' /* where true */
由于漏掉where條件或者拼接SQL后的where條件部分為true,這時整個表都被刪除/更新了...
在使用mysql的應用中,避免此類低級錯誤的方法: 1、應用仔細檢查(小心才能使得萬年船啊~) 2、開啟sql_safe_updates? mysql> set sql_safe_updates=1; Query OK, 0 rows affected (0.00 sec) mysql> delete from t; 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> delete from t where 1=1; 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源碼介紹一下sql_safe_updates的邏輯
sql_safe_update開啟后,mysql server層在調用mysql_update/mysql_delete時對where和limit進行判斷后決定是否執行,代碼調用關系: dispatch_command |->mysql_parse|->mysql_execute_command->mysql_update/mysql_delete mysql_update:(sql/sql_update.cc)
當where條件中column沒有索引可用且無limit限制時會拒絕更新
  • /* If running in safe sql mode, don't allow updates without keys */if (table->quick_keys.is_clear_all()){thd->server_status|=SERVER_QUERY_NO_INDEX_USED;if (safe_update && !using_limit){my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));goto err;}}
  • mysql_delete中:(sql/sql_delete.cc)
    當where條件為常量或者為空,或者where條件中column沒有索引可用且無limit限制時拒絕刪除
  • const_cond= (!conds || conds->const_item());safe_update=test(thd->variables.option_bits & OPTION_SAFE_UPDATES);if (safe_update && const_cond){my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));DBUG_RETURN(TRUE);}.../* If running in safe sql mode, don't allow updates without keys */if (table->quick_keys.is_clear_all()){thd->server_status|=SERVER_QUERY_NO_INDEX_USED;if (safe_update && !using_limit){delete select;free_underlaid_joins(thd, select_lex);my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));DBUG_RETURN(TRUE);}}
  • PS: update在有limit時是可以執行更新的,而delete嚴格一些,只要where條件為常量或者為空是會被拒絕的,如: mysql> update t set str='hello' where 1=1 limit 1; Query OK, 0 rows affected (0.00 sec) mysql> delete from t where 1=1 limit 1; ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column 不知道這是基于怎樣的考慮...
    不過開啟sql_safe_updates后,update和delete在修改數據時,如果不帶limit,需要where條件可以走索引,否則會報錯.

    轉載于:https://www.cnblogs.com/duanxz/p/3891540.html

    總結

    以上是生活随笔為你收集整理的mysql sql_safe_updates 分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。