Postgresql и dblink: как мне сделать ОБНОВЛЕНИЕ ОТ? - PullRequest
0 голосов
/ 30 января 2019

Вот что уже работает, но использует цикл:

(я обновляю поле nickname, slug в удаленной таблице для каждой строки в локальной таблице)

DECLARE
row_ record;
rdbname_ varchar;
....
/* select from local */
FOR row_ IN SELECT rdbname, objectvalue1 as keyhash, cvalue1 as slug, cvalue2 as nickname
    FROM bme_tag
    where rdbname = rdbname_
    and   tagtype = 'NAME'
    and  wkseq = 0

    LOOP
        /* update remote */
        PERFORM dblink_exec('sysdb',
            format(
                'update bme_usergroup
                set nickname = %L
                ,slug = %L
                where rdbname = %L
                and   wkseq = 0 
                and   keyhash = %L'
                , row_.nickname, row_.slug, row_.rdbname, row_.keyhash)
            );

END LOOP;

Теперь я хотел бы вместо этого выполнить массовую UPDATE (remote) FROM (local)

PERFORM dblink_exec('sysdb',
'update (remote)bme_usergroup
set    nickname = bme_tag.cvalue2, slug=bme_tag.cvalue1
from   (local).bme_tag s
where  bme_usergroup.rdbname        = %L
and    bme_usergroup.wkseq          = 0
and    bme_usergroup.keyhash        = s.keyhash
and    bme_usergroup.rdbname        = s.rdbname
)

Я достиг этого далеко, посмотрев различные решения ( postgresql: INSERT INTO ... (SELECT* ...) ) и я знаю, как разделить удаленные и локальные таблицы запроса в контексте SELECT, DELETE и даже INSERT/SELECT.И я могу сделать это прямое обновление с переменными связывания тоже.Но как насчет UPDATE FROM?

Если это невозможно, я должен посмотреть на FOREIGN TABLE Postgres или что-то подобное?

Локальные и удаленные БД включенытот же сервер Postgres.Еще одна дополнительная информация, если это имеет значение, заключается в том, что любая база данных может быть удалена и восстановлена ​​отдельно от другой, и я бы предпочел легкое решение, которое не требует много настроек каждый раз для восстановления связи.

1 Ответ

0 голосов
/ 30 января 2019

Да, вы должны использовать сторонние таблицы с postgres_fdw.

Таким образом, вы можете просто написать свой оператор UPDATE, как для локальной таблицы.

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

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

Используйте EXPLAIN, чтобы увидеть, что именно происходит!

...