我试图使用合并操作符来执行upsert,很快就意识到postgres不像SQL Server那样有相同的合并语句,而且有很多帖子都提到 "insert on conflict "语句来模拟。
我有一个阶段表(tabB)和最终表(tabA)--需要将STAGE表的记录upset到最终表TabA中。
表TabA
id | Val
------------
1 | 20
3 | 30
5 | 30
TabB
id | Val
------------
3 | 40
6 | 50
下面的声明,我试过不工作,说模棱两可的参考 - 我找不到涉及2表的例子。
Insert into tabA( id,val)
Select id,val
From tabB
On conflict (id)
Do update set (id, val) = (id,val)
以上不行......谁能告诉我正确的方向?
在不了解更多细节的情况下,你的代码中一个明显的错误是你试图更新ID列,这也是作为唯一的列。
更新也应该引用 excluded
记录,以避免出现关于 "模糊 "列引用的错误信息。id
可以引用表中存储的当前值或插入语句提供的新值。
insert into tabA(id, val)
select id, val
from tabB
on conflict (id)
do update
set val = excluded.val;