sql - 在冲突更新时将数据从一列插入/更新到另一列,只有那些对特定字段具有不同值的数据?
问题描述
我有两个products/tmp_products
具有以下规范的列,
当 id 不在产品中时,
我希望 sql从 tmp_products 插入到产品中。
仅当(价格或数量)值发生更改时才更新。
(id bigint primary key ,price int not null,quantity int not null ,lastupdate timestamp)
INSERT INTO products(id,price,quantity,lastupdate)
SELECT (id,price,quantity,lastupdate) FROM tmp_products
ON CONFLICT (id) DO UPDATE SET
price=EXCLUDED.price,
quantity=EXCLUDED.quantity,
lastupdate=EXCLUDED.lastupdate
where price!=EXCLUDED.price or quantity!=EXCLUDED.quantity;
我收到以下错误
column reference "price" is ambiguous
我想知道如何解决这个问题?
解决方案
问题出在where
条款中。您需要限定列,以便明确:
INSERT INTO products(id,price,quantity,lastupdate)
SELECT id,price,quantity,lastupdate FROM tmp_products
ON CONFLICT (id) DO UPDATE SET
price = EXCLUDED.price,
quantity = EXCLUDED.quantity,
lastupdate = EXCLUDED.lastupdate
WHERE products.price <> EXCLUDED.price OR products.quantity <> EXCLUDED.quantity;
请注意,您还需要删除 . 周围的括号SELECT
,否则您的查询不是有效的 Postgres SQL,并且会引发 error INSERT has more target columns than expressions
。
推荐阅读
- java - 带有 BootstrapMode.DEFERRED 的 Spring Data Jpa 多个 @EnableJpaRepositories 不起作用
- node.js - 使用 jsonwebtoken 库生成的 JWT 令牌在 jwt.io 中提供了无效签名
- java - 线图 x 轴值在库 MPAndroidchart 中重复
- c# - 如何绕过 ASMX 的输入验证
- json - asp.net core 2.1 json序列化空数组不被忽略
- javascript - 如何正确解决这个 knex.js 承诺?
- gradle - gradle 获取子项目名称、版本
- angular - Angular Material 对话框 - 关闭时发送数据
- janusgraph - Gremlin-Python 连接到现有的 JanusGraph
- c# - 将xml字符串结构转换为XDocument对象的问题