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

时间:2016-09-23 14:28:01

标签: postgresql 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上有唯一的密钥,我一直收到错误:

  

错误:列" total_comments_update"不存在

我正在寻找"对"在这种情况下,方法和最有效的方法来处理重复/冲突

我的桌子是

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

由于

1 个答案:

答案 0 :(得分:13)

您无法从DO UPDATE SET子句中的select访问列别名。您可以使用excluded表别名,其中包含因冲突而无法插入的所有行:

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的值,但由于冲突,我们无法插入。