如何在PostgreSQL 9.5中进行插入选择和重复更新?

如何在PostgreSQL 9.5中进行插入选择和重复更新?,postgresql,postgresql-9.5,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 (

我尝试在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;
我在date+blog_id上有唯一的密钥,我不断收到错误:

错误:“总注释更新”列不存在

在这种情况下,我正在寻找“正确”的方法和最有效的方法来更新重复/冲突

我的桌子是空的

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

谢谢

您无法从
DO UPDATE SET
子句中的select访问列别名。您可以使用
排除的
表别名,该别名包括由于冲突而无法插入的所有行:

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;

因此
被排除在外。最后一行中的total_comments
指的是我们试图插入的
total_comments
的值,但由于冲突,我们无法插入。

不要忘记分组依据,否则您将得到(使用postgresql 9.6.1):错误:冲突时DO UPDATE命令不能影响行第二次提示:确保在同一命令中建议插入的行没有重复的约束值。