轉:mysql中安全模式sql_safe_updates

今天在做批量更新時,想起之前遇到的一個問題。

Q:在Innodb中開啓一個事務,然後Update 不帶where,是否會鎖定全表呢?

答案是肯定的。

這裏也記錄一下如何避免這種情況,可以再Mysql中開啓安全模式避免遺漏where產生的問題。

============================================

1.什麼是安全模式
在mysql中,如果在update和delete沒有加上where條件,數據將會全部修改。不只是初識mysql的開發者會遇到這個問題,工作有一定經驗的工程師難免也會忘記寫入where條件。爲了避免失誤造成的數據全部修改和刪除,可開啓mysql的安全模式。

3.查看安全模式

show variables like "%safe%"

 sql_safe_updates就是數據庫的 安全模式。默認問關閉狀態。
開啓數據庫可以對數據進行一些不當操作的保護。
比如:在使用update,delete操作的時候沒有where條件或者limit條件的時候,就會容易誤操作整張表的數據。
安全模式也是屬於mysql系統變量的,所以查看的時候可以用variable 
2.設置安全模式
上面查詢命令實例表示當前mysql處於安全模式打開的狀態。

set sql_safe_updates=1; //安全模式打開狀態
set sql_safe_updates=0; //安全模式關閉狀態

3.update、delete操作
update
(1)無where條件的update,操作失敗,會提示需要使用where條件作爲主鍵。
(2)無where條件但是有limit的update,操作成功,雖然沒有where條件,但是加入了limit限制。
(3)使用非索引字段作爲條件進行更新,操作失敗,因爲條件字段不是索引字段並且沒有加入limit限制。
(4)使用非索引字段作爲條件並且加入limit進行更新,操作成功,雖然條件字段不是索引字段,但是有加入limit限制,所以執行成功。
(5)使用索引字段作爲條件並且不加入limit進行更新,操作成功,雖然沒有加入limit限制,但是條件字段爲索引字段,所以執行成功。
delete
(1)無where條件的delete,操作失敗,沒有where條件
(2)非索引鍵進行條件刪除,操作失敗
(3)使用索引鍵並且不加limit限制進行刪除。操作成功
(4)加入limit但是不使用where條件刪除。操作失敗,因爲沒有加入where檢索條件。
————————————————
版權聲明:本文爲CSDN博主「臥雲港」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章