You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 8.0.33执行DELETE语句遇Error Code1175问题求助

MySQL Error Code 1175 排查与解决

错误原因分析

MySQL 8.0的**安全更新模式(safe update mode)**会拦截无精准键列过滤的DELETE/UPDATE操作,防止误删/误改全表数据。你的第一个DELETE语句触发错误的核心原因:

  • 虽然WHERE子句包含emp_id <> -1(emp_id是employees表主键),但该条件仅排除单个值,安全模式默认判定其属于“几乎操作全表”的高风险逻辑;
  • managerid in (...)中的managerid是employees表的普通列(非键列),无法被安全模式识别为有效过滤条件;
  • 对比可正常执行的第二个语句:name in (...)的子查询返回经过replace处理的结果,优化器判定该条件能过滤出少量数据,结合emp_id <> -1后,被安全模式认定为低风险操作,因此允许执行。

解决方法

1. 替换为精准的主键范围过滤(推荐)

将emp_id <> -1替换为更精准的主键范围条件,让安全模式识别为精准过滤:

delete from employees
where managerid in (
    select managerid
    from managers
    where CATEGORY = "Sales"
)
and emp_id > 0; -- 假设业务中emp_id均为正整数,根据实际情况调整范围

2. 临时关闭安全更新模式

在当前会话中临时关闭安全检查,执行完DELETE后可按需恢复:

SET SQL_SAFE_UPDATES = 0;
-- 执行目标DELETE语句
delete from employees
where managerid in (
    select managerid
    from managers
    where CATEGORY = "Sales"
)
and emp_id <> -1;
-- 可选:重新开启安全模式
SET SQL_SAFE_UPDATES = 1;

3. 添加LIMIT限定操作行数

如果能预估待删除数据量,通过LIMIT限定操作范围:

delete from employees
where managerid in (
    select managerid
    from managers
    where CATEGORY = "Sales"
)
and emp_id <> -1
LIMIT 1000; -- 根据实际业务设置合理行数

4. 强制使用主键索引

通过FORCE INDEX强制优化器使用主键索引,让安全模式识别到键列的有效使用:

delete from employees FORCE INDEX (PRIMARY)
where managerid in (
    select managerid
    from managers
    where CATEGORY = "Sales"
)
and emp_id <> -1;

内容的提问来源于stack exchange,提问作者Shalini Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:13:29