首页 > 解决方案 > 在冲突更新时将数据从一列插入/更新到另一列,只有那些对特定字段具有不同值的数据?

问题描述

我有两个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
我想知道如何解决这个问题?

标签: sqlpostgresqlselectsql-updatesql-insert

解决方案


问题出在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


推荐阅读