我有一个分区表和一个更新函数/触发器。更新行时,它首先删除该行,然后将其插入到正确的分区中。我的问题是我正在尝试做一个类似于 Oracle 中的 MERGE 的语句。我在 Postgres 中找到了使用 UPSERT 的类似实现的参考,如下所示:
WITH upsert as
(
update mytable2 m
set sales=m.sales+d.sales,
status=d.status
from mytable d
where m.pid=d.pid
RETURNING m.*
)
insert into mytable2
select a.pid, a.sales, 'NEW'
from mytable a
where a.pid not in (select b.pid from upsert b);
但是,问题是更新首先触发 - 在特定行上导致删除和插入,然后插入再次插入。这是因为我在分区上的更新功能/触发器。有没有办法让它像在 Oracle 中那样通过合并(即如果找到行,更新它,否则插入它)而不会导致欺骗或因违反约束而失败?
非常感谢您的帮助!