遵循范式设计表时,如何按厚度范围批量更新setting.amps字段?
解决UPDATE语句关联表更新的语法错误问题
看起来你遇到的核心问题是不同SQL数据库对关联表UPDATE的语法规则不一样,你当前的写法更偏向PostgreSQL风格,但如果是在MySQL环境下就会触发语法错误;反过来如果是PostgreSQL环境,也存在表别名引用的逻辑问题。下面分两种主流数据库场景给出正确的语句:
情况1:使用MySQL/MariaDB
MySQL不支持UPDATE ... FROM的写法,正确的关联更新语法是直接在UPDATE后跟上需要关联的表,通过JOIN建立连接关系,再设置更新字段:
UPDATE setting s JOIN materials m ON s.material_id = m.id JOIN material_thickness mt ON m.thickness_id = mt.id SET s.amps = 65 WHERE mt.thickness BETWEEN 5 AND 10;
情况2:使用PostgreSQL
PostgreSQL支持FROM子句,但要注意不能在FROM中重复引用要更新的表却不做关联,你可以用两种方式实现:
方式一:直接关联更新
UPDATE setting SET amps = 65 FROM materials m JOIN material_thickness mt ON m.thickness_id = mt.id WHERE setting.material_id = m.id AND mt.thickness BETWEEN 5 AND 10;
方式二:用子查询匹配目标行(和你原SELECT逻辑完全对齐)
这种写法更直观,相当于用你已经验证过的SELECT结果来锁定要更新的行:
UPDATE setting SET amps = 65 WHERE id IN ( SELECT s.id FROM setting s JOIN materials m ON s.material_id = m.id JOIN material_thickness mt ON m.thickness_id = mt.id WHERE mt.thickness BETWEEN 5 AND 10 );
为什么你的原语句会报错?
- 如果是MySQL环境:
UPDATE ... FROM属于非标准语法,MySQL不支持,直接触发语法错误。 - 如果是PostgreSQL环境:你在FROM里重新定义了
setting AS s,但没有将这个别名和要更新的主setting表建立关联关系,数据库无法确定要更新哪些行,因此抛出错误。
内容的提问来源于stack exchange,提问作者joe blogs
相关产品推荐
相关产品推荐

