postgresql - 邮递员。在一条 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
解决方案
在手册中是这样说的:
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
您这样做的方式是使用与表中已存在的值相同的值更新列。
推荐阅读
- pandas - 在 MultiIndex 下转换 pandas 列的类型
- generics - NSubstitute 与泛型
- windows - 一行中删除多个文件 PS
- android - 如何修复上下文对话
- c# - 替换字符串中的占位符标记
- c# - 在 Windows 经典主题上,Visual Styles 相关操作导致错误
- javascript - Mongoose:find() - 匹配两个值并仅返回匹配的文档
- android - hystrix电路短路并且是开放的android
- javascript - JS标签后添加按钮
- r - dplyr。光谱(反射率)数据框。基于单个属性平均所有光谱值。R