PostgreSQL 12 で Merge っぽい事をやる

 
BigQuery でいつも使ってる MERGE を Postgres 12 でやろうとしたらなかったので代替策をメモ。

ON CONFLICT を使う。

BigQuery だとこうだけど:

MERGE my_tbl t1 
USING my_tmp t2
ON t1.mykey = t2.mykey
WHEN MATCHED THEN
UPDATE SET hoge = t2.hoge, fuga = t2.fuga
WHEN NOT MATCHED THEN
INSERT(mykey, hoge, fuga)
VALUES(mykey, hoge, fuga);

Postgres だとこう書く:

INSERT INTO my_tbl
SELECT mykey, hoge, fuga FROM my_tmp
ON CONFLICT (mykey)
DO UPDATE 
SET hoge = excluded.hoge, fuga = excluded.fuga;

キーが重複した行の値が excluded という一時領域に退避されるので、それを update 文で入れる。