如何在 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
的值,我们试图插入但由于冲突而无法插入。
我正在尝试在 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
的值,我们试图插入但由于冲突而无法插入。