不关闭MySQL安全更新模式如何解决UPDATE操作报错1175
问题根因
你遇到的1175报错是MySQL安全更新模式的触发提示:
Error Code: 1175. 您正在使用安全更新模式,尝试更新表时WHERE子句未使用KEY列,如需禁用安全模式,请在「偏好设置 -> SQL编辑器」中切换选项后重新连接。
安全更新模式的核心规则是:执行不带LIMIT的UPDATE/DELETE语句时,WHERE子句必须使用*索引列(KEY列)*作为过滤条件,避免误操作全表数据。本次报错有两个触发原因:
- WHERE条件用到的
qtyinstock列未创建索引,不属于规则要求的KEY列 - 你写的嵌套子查询完全冗余,当表有多行时还会返回多值引发赋值错误,完全可以简化
无需禁用安全更新模式的解决方案
- 方案1:给过滤列加索引(推荐,同时可提升UPDATE执行效率)
先给qtyinstock列创建普通索引,满足安全模式对KEY列的要求:
再执行简化后的UPDATE语句即可:ALTER TABLE test ADD INDEX idx_qtyinstock (qtyinstock);UPDATE test SET unit_price = unit_price * 1.15 WHERE qtyinstock > 0; - 方案2:WHERE条件追加主键过滤
如果test表存在主键(比如常见的自增主键id),可以在WHERE中追加主键的有效过滤条件,让安全模式识别到KEY列的使用:
注:UPDATE test SET unit_price = unit_price * 1.15 WHERE qtyinstock > 0 AND id > 0;id > 0是自增主键匹配所有有效行的通用写法,可根据你的表主键命名、取值规则调整为匹配所有有效行的主键条件即可。
内容的提问来源于stack exchange,提问作者Elohim Miranda
相关产品推荐
相关产品推荐

