Как написать такой запрос, используя dblink в postgres?

Вот так выглядит мой запрос -

INSERT INTO localdb_image select * from 
dblink('host=10.1.1.1
 user=user
 password=password
 dbname=oat', 'SELECT e.* FROM image e JOIN archived f ON e.image_id=f.image_id AND e.dd=f.dd') tt(
      id int ,
  drive_id character varying(255) ,
 ) ;

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

Где я могу добавить что-то подобное в запросе выше?

 WHERE NOT EXISTS (SELECT 1 from localdb_image ei where ei.id = e.id)

Единственное, о чем я могу думать, это просто создать материализованное представление следующим образом:

create materialized view mv_localdb_image as select * from 
    dblink('host=10.1.1.1
     user=user
     password=password
     dbname=oat', 'SELECT e.* FROM image e JOIN archived f ON e.image_id=f.image_id AND e.dd=f.dd') tt(
          id int ,
      drive_id character varying(255) ,
     ) ;

А потом обновлять это периодически.

И вставьте в localdb следующее:

insert into localdb_image select * from mv_localdb_image mv where not exists (
select 1 from localdb_image ii where ii.id=mv.id)

Кто-нибудь знает, как мы можем достичь этого напрямую, не создавая материализованное представление и не редактируя первый запрос, который я написал выше?

1 ответ

Решение

Если столбец id является первичным ключом:

-- pseudocode
insert into localdb_image 
select *
from dblink(...) tt (...)
on conflict(id) do nothing;

Если id не pk, создайте индекс, чтобы сделать его уникальным. Ваша версия Postgres должна быть 9.5+.

Другие вопросы по тегам