如何在 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;
鉴于此 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;