Postgres。在一个 SQL 语句中插入不存在的行并更新已存在的行

Postgres. Insert rows that do not exist and update rows that already exist in one SQL statement

我正在尝试根据 ID 是否已存在于 table 中,在一个 postgres 语句中批量插入或更新行到数据库。我会updating/inserting同时100行或更多行

我能在网上找到的最接近的解决方案是下面的 ON CONFLICT 语句,但这并没有给我想要的结果。

开始 table 数据示例

ID |  DATE       | PRICE
1  |  1/02/2019  | 10

INSERT INTO table1 (id, date, price) 
VALUES (1, '1/14/2019', 20), (2, '1/15/2019', 43) 
ON CONFLICT(id) DO UPDATE 
SET date = table1."date", price = table1.price

以下是在 运行 上述 SQL 语句

之后更新的 table
ID |  DATE       | PRICE
1  |  1/02/2019  | 10
2  |  1/15/2019  | 43

插入了带 ID 的行,但第一行的值未更新为新值,而是保留 table

中已有的旧值

我想要的结果如下

ID |  DATE       | PRICE
1  |  1/14/2019  | 20
2  |  1/15/2019  | 43

manual 中是这样写的:

The SET and WHERE clauses in ON CONFLICT DO UPDATE have access to the existing row using the table's name (or an alias), and to rows proposed for insertion using the special excluded table.

(强调我的)。

所以,你的声明应该是:

INSERT INTO table1 (id, date, price) 
VALUES (1, '1/14/2019', 20), (2, '1/15/2019', 43) 
ON CONFLICT(id) DO UPDATE 
SET date = EXCLUDED."date", price = EXCLUDED.price

您这样做的方式是使用 table.

中已存在的相同值更新列