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

如何在不关闭安全更新时解决MySQL Workbench中含主键的UPDATE 1175错误?

解决MySQL Workbench 1175错误的JOIN UPDATE改写方案

我之前也踩过这个坑!MySQL Workbench的安全更新机制有时候对带JOIN的UPDATE语句有点“刻板”——哪怕你确实用到了主键关联,它可能没识别到WHERE子句里的主键过滤逻辑,照样抛出1175错误。下面给你两个不用关闭安全模式的可行改写方案:

方案一:用子查询+EXISTS替代JOIN

这种写法会让Workbench明确看到你在WHERE子句里直接引用了目标表charges的主键ChargeID,安全检查会直接放行:

UPDATE `charges`
SET `charges`.`ChargeClearDate` = (
    SELECT `charges_arc`.`ChargeClearDate`
    FROM `charges_arc`
    WHERE `charges_arc`.`ChargeID` = `charges`.`ChargeID`
)
WHERE EXISTS (
    SELECT 1
    FROM `charges_arc`
    WHERE `charges_arc`.`ChargeID` = `charges`.`ChargeID`
);
  • 子查询用来获取charges_arc中对应行的ChargeClearDate值
  • EXISTS子句确保只更新在charges_arc中有匹配的行,同时让安全检查识别到目标表的主键过滤条件

方案二:保留JOIN,给WHERE子句加一个明确的主键条件

如果你更习惯JOIN的写法,只要在WHERE子句里加一个针对charges表主键的有效条件(哪怕是恒真的),就能绕过安全检查:

UPDATE `charges`
INNER JOIN `charges_arc` ON `charges`.`ChargeID` = `charges_arc`.`ChargeID`
SET `charges`.`ChargeClearDate` = `charges_arc`.`ChargeClearDate`
WHERE `charges`.`ChargeID` IS NOT NULL;

因为ChargeID是主键,不可能为NULL,所以这个条件不会过滤掉任何需要更新的行,但Workbench的安全检查会认为你指定了目标表的主键过滤规则,不会触发1175错误。

为什么原语句会报错?

原语句里的WHERE charges.ChargeID = charges_arc.ChargeID其实是JOIN关联条件的重复,Workbench的安全检查会把它当成两个表的关联逻辑,而不是针对目标表charges的主键过滤条件,所以没通过检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:10:31