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

时间:2019-01-15 01:56:24

标签: postgresql upsert

我试图根据一个ID是否已存在于表中,在一个postgres语句中批量向数据库中插入或更新行。我将同时更新/插入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

1 个答案:

答案 0 :(得分:0)

manual中这样说:

  

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

>

(强调我的)。

因此,您的声明应该是:

<hash-of-B4>..H

您的操作方式是,使用与表中已存在的值相同的值更新列。