如何在 Postgres 中插入带有 ON CONFLICT UPDATE 子句的多条记录?

How do I insert multiple records with an ON CONFLICT UPDATE clause in Postgres?

鉴于此 table,这只是一个示例。

CREATE TABLE orders(
     order_id text primary key,
     payment_status text not null
)

我需要对多条记录执行 upsert

INSERT INTO orders(
        order_id, 
        payment_status
)
VALUES ('101','Paid'), ('102', 'Unpaid')
ON CONFLICT (order_id) DO UPDATE SET
        payment_status = payment_status;

payment_status returns 因为 模棱两可 .

我这里要解决的问题是我有一个导入数据的进程,但是如果遇到冲突,需要用新数据更新当前数据。 (这是一个历史 table,有时会为其历史获取新数据)我可以将其分解为单个插入,但这会产生巨大的性能成本。

我也需要用这个更新不止一个专栏,如果重要的话,不仅仅是 payment_status

使用excluded记录:

INSERT INTO orders(
        order_id, 
        payment_status
)
VALUES ('101','Paid'), ('102', 'Unpaid')
ON CONFLICT (order_id) DO UPDATE 
   SET  payment_status = EXCLUDED.payment_status;