PostgreSQL执行含三表关联的UPDATE查询时join报错如何处理
PostgreSQL多表关联UPDATE报错解决方法
错误原因
你写的UPDATE语法是MySQL支持的写法,PostgreSQL不兼容该语法,主要有两个问题:
- PostgreSQL不支持直接在UPDATE关键字后接JOIN子句,关联表必须放在
FROM子句中声明 - 单条UPDATE语句仅支持更新一张表的字段,你原语句同时更新table1和table3的字段,不符合语法要求
解决方案
方案1:拆分UPDATE语句(需要同时更新两个表时)
如果你确实需要同时修改table1和table3的字段,需要拆分为两条UPDATE语句,可通过事务包裹保证操作原子性:
-- 开启事务保证两条更新操作同时成功/失败 BEGIN; -- 更新table1的name字段 UPDATE table1 SET name = 'Test' FROM table2 WHERE table1.id = table2.id1 AND table1.id = '21003'; -- 更新table3的equipment_code字段 UPDATE table3 SET equipment_code = 'ABC' FROM table2, table1 WHERE table2.id2 = table3.id AND table1.id = table2.id1 AND table1.id = '21003'; COMMIT;
方案2:单表更新(仅需要更新table1字段时)
如果你实际只需要更新table1的字段,不需要修改table3,直接用FROM子句声明关联表即可:
UPDATE table1 SET name = 'Test' FROM table2 JOIN table3 ON table2.id2 = table3.id WHERE table1.id = table2.id1 AND table1.id = '21003';
注意事项
- 关联查询的过滤条件要写在WHERE子句中,不要和关联条件混写避免逻辑错误
- 涉及多表数据修改时,建议用事务包裹操作,避免部分更新成功导致的数据不一致
内容的提问来源于stack exchange,提问作者Tech buddy
相关产品推荐
相关产品推荐

