首页 > 解决方案 > 如何在 Postgres 中使用 ON CONFLICT UPDATE 子句插入多条记录?

问题描述

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

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

我需要对多条记录进行更新插入。

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返回为ambiguous

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

我还需要用这个更新不止一列,而不仅仅是payment_status如果这很重要。

标签: sqlpostgresqlupsert

解决方案


使用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;

推荐阅读