2016-09-23 20 views
1

私は日付+ blog_idに一意のキーを持っていると私はエラーを得続けるPostgreSQLのPostgreSQL 9.5でINSERT INTO SELECTとUPDATE UPDATEを行う方法は?

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; 

で次の操作を実行するためにしようとしている:

ERROR: column "total_comments_update" does not exist

私は「右」を探しています道と私のテーブルがある

この場合には、重複/競合の更新を行うための最も効率的な方法

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

ありがとう

答えて

8

DO UPDATE SET節の選択項目から列エイリアスにアクセスすることはできません。あなたは競合のために挿入できませんでしたすべての行が含まれて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の値を参照し、ので、紛争の

+0

GROUP BYまたはあなたが(PostgreSQLの9.6.1を)買ってあげることを忘れないでください: ERROR:CONFLICT ON UPDATEコマンドが二度目に ヒントを行影響を与えることができないでください:行が内に挿入するために提案しないことを確認してください同じコマンドに重複した制約値があります。 – user1767316

関連する問題