web-dev-qa-db-ja.com

一括挿入、Postgresでの競合(一括アップサート)の場合は更新

ユーザーデータを一括挿入するデータマイニングプログラムを作成しています。

現在のSQLは単純な一括挿入です。

insert into USERS(
    id, username, profile_picture)
select unnest(array['12345']),
    unnest(array['Peter']),
    unnest(array['someURL']),
on conflict (id) do nothing;

競合が発生した場合、どのように更新しますか?私は試した:

...
    unnest(array['Peter']) as a,
    unnest(array['someURL']) as b,
on conflict (id) do 
update set
    username = a,
    profile_picture = b;

ただし、There is a column named "a" in table "*SELECT*", but it cannot be referenced from this part of the query.エラー。

[〜#〜] edit [〜#〜]

USERSの表は非常に単純です:

create table USERS (
    id      text not null primary key,
    username    text,
    profile_picture text
);
31
MK Yung

excludedという名前の特別なテーブルには、挿入する行が含まれています(ただし、奇妙な名前です)

insert into USERS(
    id, username, profile_picture)
select unnest(array['12345']),
    unnest(array['Peter']),
    unnest(array['someURL'])
on conflict (id) do 
update set
    username = excluded.username,
    profile_picture = excluded.profile_picture;

http://www.postgresql.org/docs/9.5/static/sql-insert.html#SQL-ON-CONFLICT

ON CONFLICT DO UPDATEのSET句とWHERE句は、テーブルの名前(またはエイリアス)を使用して既存の行にアクセスし、特別な除外テーブルを使用して挿入が提案された行にアクセスします...

69
MK Yung