Postgresql 和 dblink:如何进行更新?
Postgresql and dblink: how do I do an UPDATE FROM?
下面是已经可以使用的方法,但它使用了一个循环:
(我正在为本地 table 中的每一行更新远程 table 上的 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
的上下文中分离查询的远程和本地 tables ]、DELETE
甚至INSERT/SELECT
。我也可以使用绑定变量进行直接更新。但是 UPDATE FROM
呢?
如果不可能,我应该看看 Postgres 的 FOREIGN TABLE
或类似的东西吗?
本地和远程数据库都在同一个 Postgres 服务器上。如果重要的话,还有一点信息是,任一数据库都可以单独删除和恢复,我更喜欢一种轻量级的解决方案,它不需要每次都进行大量配置来重新建立通信。
是的,您应该将外国 table 与 postgres_fdw 一起使用。
这样您就可以像编写本地 table.
一样编写 UPDATE
语句
这肯定会更快,但您可能仍在数据库之间交换大量数据。
如果这是一个选项,那么最快的方法可能是 运行 更新 table 所在的数据库上的语句,并将另一个 table 定义为外部 table.这样你可能会避免获取然后发送 table 数据。
使用EXPLAIN
看看到底发生了什么!
下面是已经可以使用的方法,但它使用了一个循环:
(我正在为本地 table 中的每一行更新远程 table 上的 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
的上下文中分离查询的远程和本地 tables ]、DELETE
甚至INSERT/SELECT
。我也可以使用绑定变量进行直接更新。但是 UPDATE FROM
呢?
如果不可能,我应该看看 Postgres 的 FOREIGN TABLE
或类似的东西吗?
本地和远程数据库都在同一个 Postgres 服务器上。如果重要的话,还有一点信息是,任一数据库都可以单独删除和恢复,我更喜欢一种轻量级的解决方案,它不需要每次都进行大量配置来重新建立通信。
是的,您应该将外国 table 与 postgres_fdw 一起使用。
这样您就可以像编写本地 table.
一样编写UPDATE
语句
这肯定会更快,但您可能仍在数据库之间交换大量数据。
如果这是一个选项,那么最快的方法可能是 运行 更新 table 所在的数据库上的语句,并将另一个 table 定义为外部 table.这样你可能会避免获取然后发送 table 数据。
使用EXPLAIN
看看到底发生了什么!