今天在做批量更新時,想起之前遇到的一個問題。
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 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接: