0
我有一個分區表和一個更新函數/觸發器。當一行被更新時,它首先刪除該行,然後將其插入到適當的分區中。我的問題是,我正在嘗試做一個類似於Oracle中的MERGE的聲明。我發現參考Postgres的一個類似的實現使用UPSERT如下列:在分區表上的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那樣通過合併(即,如果找到了行,更新它,或者插入它)而使其在Oracle中工作,而不會導致欺騙或在違反約束時失敗?
非常感謝您的幫助!
您有一個更新函數/觸發器,與您發佈的upsert代碼無關嗎? –
因此,以上面的例子來說,更新觸發器將位於mytable2分區表上。觸發器在每個分區上並在更新之前觸發。它刪除OLD.pid = pid所在的行(如上例所示)。然後使用NEW。*值插入。這個函數/觸發器對於管理表是必需的,因爲它是一個大表。我想要做的另一個過程是每天合併到表中,因爲它是一個分析數據庫,我希望獲得新的每日行。如果您還有其他問題,請告訴我。我感謝你的迴應。 – user3412041
對不起,我沒有看到觸發器。我沒有看到分區表。不過,我會用合適的EXISTS結構替換IN。 – wildplasser