如何在PostgreSQL 9.5中进行插入选择和重复更新?
我尝试在PostgreSQL中执行以下操作如何在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 (
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命令不能影响行第二次提示:确保在同一命令中建议插入的行没有重复的约束值。