Как выполнить upsert при обновлении таблицы из другой таблицы postgres?

#sql #postgresql

#sql #postgresql

Вопрос:

У меня есть таблица, A которая содержит около 10 миллионов строк, и таблица B , которая содержит некоторую обновленную информацию для некоторых строк в таблице A , а также содержит новые строки, которые не существуют в таблице A .

Я хочу обновить таблицу A с помощью table B и в то же время вставить строки, которые не имеют совпадений в таблице A .

Я нашел много ответов, подобных приведенному ниже решению, но, похоже, во всех них отсутствует часть вставки, которую я ищу.

 UPDATE A 
SET code = B.code
FROM B
WHERE A.id = B.id 
  

Комментарии:

1. Если данные находятся в двух таблицах, просто запустите два запроса, update и an insert .

Ответ №1:

Используйте два запроса:

 update a
    set code = b.code
    from b
    where a.id = b.id;

insert into a (id, code)
    select id, code
    from b
    where not exists (select 1 from a where a.id = b.id);
  

Вы также можете использовать on conflict

 insert into a (id, code)
    select b.id, b.code
    on conflict on constraint a_id
    do update set code = b.code;