正如 Henrik 所写,您可以使用 dblink 连接远程数据库并获取结果。例如:
psql dbtest
CREATE TABLE tblB (id serial, time integer);
INSERT INTO tblB (time) VALUES (5000), (2000);
psql postgres
CREATE TABLE tblA (id serial, time integer);
INSERT INTO tblA
SELECT id, time
FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
AS t(id integer, time integer)
WHERE time > 1000;
TABLE tblA;
id | time
----+------
1 | 5000
2 | 2000
(2 rows)
PostgreSQL 有record http://www.postgresql.org/docs/current/static/datatype-pseudo.html伪类型(仅适用于函数的参数或结果类型),它允许您从另一个(未知)表查询数据。
Edit:
如果您愿意,您可以将其作为准备好的声明,并且它也有效:
PREPARE migrate_data (integer) AS
INSERT INTO tblA
SELECT id, time
FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
AS t(id integer, time integer)
WHERE time > $1;
EXECUTE migrate_data(1000);
-- DEALLOCATE migrate_data;
编辑(是的,另一个):
我刚刚看到你的修改后的问题 https://stackoverflow.com/questions/6086914/postgresql-insert-into-select-ii(作为重复项关闭,或者与此非常相似)。
如果我的理解是正确的(postgres 有 tbla,dbtest 有 tblb,你想要带有本地选择的远程插入, not 远程选择和本地插入如上):
psql dbtest
SELECT dblink_exec
(
'dbname=postgres',
'INSERT INTO tbla
SELECT id, time
FROM dblink
(
''dbname=dbtest'',
''SELECT id, time FROM tblb''
)
AS t(id integer, time integer)
WHERE time > 1000;'
);
我不喜欢嵌套的 dblink,但据我所知,我无法引用 tblBdblink_exec http://www.postgresql.org/docs/current/static/contrib-dblink-exec.html身体。使用 LIMIT 指定前 20 行,但我认为您需要首先使用 ORDER BY 子句对它们进行排序。