PostgreSQL多表更新报错:同一查询不可多次更新同一行求解决
修正后的UPDATE语句
问题原因
原语句在FROM子句中重复引用了目标表table1 t1,这会导致同一个t1行可能匹配到多个t2行,触发PostgreSQL的"同一查询不允许多次更新同一行"的限制,同时关联逻辑存在冗余。
基础修正版本(确保每行仅匹配一个t2记录)
如果t1和t2的schemaname/tablename关联条件能保证唯一匹配,使用以下语句:
UPDATE table1 t1 SET field1 = t2.field1 FROM table2 t2 WHERE upper(t1.schemaname) = upper(t2.databasename) AND upper(t1.tablename) = upper(t2.tablename) AND t1.field1 != t2.field1 AND t1.field1 != 'test' AND t2.field1 IN ('abc', 'def');
处理多行匹配的版本(若存在多个t2记录匹配同一t1行)
如果关联条件可能返回多个t2记录,需通过去重或聚合确保每行仅被更新一次。例如取任意一个匹配的t2.field1:
UPDATE table1 t1 SET field1 = t2.field1 FROM ( SELECT DISTINCT ON (upper(databasename), upper(tablename)) upper(databasename) AS db_name, upper(tablename) AS tbl_name, field1 FROM table2 WHERE field1 IN ('abc', 'def') ) t2 WHERE upper(t1.schemaname) = t2.db_name AND upper(t1.tablename) = t2.tbl_name AND t1.field1 != t2.field1 AND t1.field1 != 'test';
你可以在子查询的SELECT后添加ORDER BY子句,指定优先取哪一条匹配记录(比如ORDER BY upper(databasename), upper(tablename), update_time DESC)。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

