如何在不关闭安全更新时解决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
相关产品推荐
相关产品推荐

