如何在 PostgreSQL 9.5 中执行 INSERT INTO SELECT 和 ON DUPLICATE UPDATE?

How to do INSERT INTO SELECT and ON DUPLICATE UPDATE in PostgreSQL 9.5?

我正在尝试在 PostgreSQL 中执行以下操作

INSERT INTO blog_sums ( blog_id, date, total_comments)
    SELECT blog_id, '2016-09-22', count(comment_id) as total_comments_update
    FROM blog_comments
    WHERE date = '2016-09-22'
    GROUP BY blog_id         
ON CONFLICT (blog_id ,date)
DO UPDATE SET blog_sums.total_comments = total_comments_update;

我在日期 + blog_id 上有唯一密钥,但我不断收到错误:

ERROR: column "total_comments_update" does not exist

在这种情况下,我正在寻找 "right" 方法以及对 duplicate/conflict 进行更新的最有效方法

我的桌子是

blog_comments (blog_id, comment_id, comment, date)
blog_sums ( blog_id, date, total_comments) . unique on blog_id+date

谢谢

您不能从 DO UPDATE SET 子句中的 select 访问列别名。您可以使用 excluded table 别名,其中包括因冲突而未能插入的所有行:

INSERT INTO blog_sums ( blog_id, date, total_comments)
    SELECT blog_id, '2016-09-22', count(comment_id) as total_comments_update
    FROM blog_comments
    WHERE date = '2016-09-22'
    GROUP BY blog_id         
ON CONFLICT (blog_id ,date)
DO UPDATE SET total_comments = excluded.total_comments;

所以最后一行的 excluded.total_comments 指的是 total_comments 的值,我们试图插入但由于冲突而无法插入。