首页 > 解决方案 > 邮递员。在一条 SQL 语句中插入不存在的行并更新已存在的行

问题描述

我正在尝试在一个 postgres 语句中批量插入或更新行到数据库,具体取决于 ID 是否已存在于表中。我将同时更新/插入 100 行或更多行

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

起始表数据示例

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语句后更新的表

ID |  DATE       | PRICE
1  |  1/02/2019  | 10
2  |  1/15/2019  | 43

插入了具有 ID 的行,但第一行的值不会用新值更新,而是保留表中已有的旧值

我想要的结果如下

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

标签: postgresqlupsert

解决方案


手册中是这样说的:

ON CONFLICT DO UPDATE 中的 SET 和 WHERE 子句可以使用表的名称(或别名)访问现有行,并使用特殊的排除表访问建议插入的行。

(强调我的)。

所以,你的陈述应该是:

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

您这样做的方式是使用与表中已存在的值相同的值更新列。


推荐阅读