Подтвердить что ты не робот

Массовая вставка, обновление в случае конфликта (объемный upsert) на 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..

ИЗМЕНИТЬ

Таблица USERS очень проста:

create table USERS (
    id      text not null primary key,
    username    text,
    profile_picture text
);
4b9b3361

Ответ 1

Вызывается специальная таблица с именем 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

Предложения SET и WHERE в ON CONFLICT DO UPDATE имеют доступ к существующей строке, используя имя таблицы (или псевдоним) и строки, предложенные для вставки, используя специальную исключенную таблицу...