首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL Error 1175 解決:Safe Update Mode (SQL_SAFE_UPDATES) 原理與關閉姿勢

     編輯:MySQL 綜合教學

錯誤現象

Error Code: 1175. You are using safe update mode and you tried to update a table 
without a WHERE that uses a KEY column. 
To disable safe mode, toggle the option in Preferences -> SQL Editor -> Query Editor and reconnect.

根因:SQL_SAFE_UPDATES 系統變量

值行為限制適用場景
1 (ON) - 默認開啟1. UPDATE/DELETE 必須帶 WHERE 條件。
2. WHERE 條件必須包含鍵列 (主鍵、唯一索引、普通索引)。
3. LIMIT 子句不豁免。
防止誤執行 UPDATE t SET x=1 導致全表修改的「手抖」保護。
0 (OFF)無限制,允許全表更新/刪除。批量數據清洗、遷移腳本、管理員操作。

觸發條件示例

-- ❌ 報錯 1175:無 WHERE
UPDATE users SET status = 1;

-- ❌ 報錯 1175:WHERE 非鍵列 (name 無索引)
UPDATE users SET status = 1 WHERE name = 'Zhang San';

-- ✅ 通過:WHERE 主鍵
UPDATE users SET status = 1 WHERE id = 100;

-- ✅ 通過:WHERE 唯一索引
UPDATE users SET status = 1 WHERE email = 'a@b.com';

-- ✅ 通過:WHERE 普通索引
UPDATE users SET status = 1 WHERE age > 20; -- age 有索引

解決方案

方案一:會話級關閉 (推薦,影響最小)

SET SESSION SQL_SAFE_UPDATES = 0;
-- 執行危險操作
DELETE FROM logs WHERE created_at < '2023-01-01';
-- 恢復 (可選)
SET SESSION SQL_SAFE_UPDATES = 1;

方案二:全局關閉 (配置文件,永久)

編輯 my.cnf:
[mysqld]
sql_safe_updates=0

重啟服務。

方案三:GUI 客戶端設置 (Navicat / Workbench / DBeaver)

  • Navicat:工具 -> 選項 -> 查詢編輯器 -> 取消勾選「安全更新模式」。
  • Workbench:Edit -> Preferences -> SQL Editor -> 取消勾選「Safe Updates」。**需重新連線生效**。
  • DBeaver:驅動屬性 -> 連接屬性 -> sessionVariables=SQL_SAFE_UPDATES=0。

最佳實踐建議

  1. 默認保持開啟 (ON):作為防誤操作最後一道防線。
  2. 腳本/遷移時局部關閉:在 SQL 文件頭部加 SET SESSION SQL_SAFE_UPDATES = 0;,尾部恢復。
  3. 善用 LIMIT 保護:即使關閉 Safe Mode,大批量操作也建議分批 LIMIT 1000 循環執行,減少鎖持有時間、Binlog 體積、回滾代價。
  4. 索引覆蓋:確保高頻 WHERE 列有索引,既滿足 Safe Mode,又提升性能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved