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