Как написать такой запрос, используя 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+.