日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

mysql sql_safe_updates 分析

發布時間:2025/3/13 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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