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.
中已存在的相同值更新列
我正在尝试根据 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 语句
之后更新的 tableID | 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.
中已存在的相同值更新列