postgresql:INSERT INTO …(SELECT * …)

我不确定它的标准SQL:

INSERT INTO tblA (SELECT id, time FROM tblB WHERE time > 1000) 

我在找的是: 如果tblA和tblB在不同的数据库服务器中

PostgreSql是否提供了任何实用工具,或者有什么function可以帮助在INSERT query with PGresult struct使用INSERT query with PGresult struct

我的意思是SELECT id, time FROM tblB ...将使用PQexec返回一个PGresult* 。 是否有可能在另一个PQexec使用此结构来执行INSERT命令。

编辑:
如果不可能,那么我会去提取PQresult *的值,并创build一个多重INSERT语句的语法,如:

 INSERT INTO films (code, title, did, date_prod, kind) VALUES ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'), ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'); 

有没有可能创build一个准备的声明! 🙁

正如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具有logging伪types(仅用于函数的参数或结果types),它允许您从另一个(未知)表中查询数据。

编辑:

你可以把它作为准备好的声明,如果你愿意,它也可以工作:

 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; 

编辑(是的,另一个):

我刚刚看到你修改的问题 (closures重复,或只是非常相似)。

如果我的理解是正确的(postgres有tbla和dbtest有tblb,并且您希望使用本地select进行远程插入 ,而不是像上面那样使用本地插入进行远程select ):

 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,但AFAIK我不能在dblink_exec正文中引用tblB 。 使用LIMIT指定前20行,但我认为你需要先使用ORDER BY子句对它们进行sorting。

如果你想插入指定的列:

 INSERT INTO table (time) (SELECT time FROM dblink('dbname=dbtest', 'SELECT time FROM tblB') AS t(time integer) WHERE time > 1000 ); 

您可以使用dblink创build在另一个数据库中parsing的视图。 该数据库可能位于另一台服务器上。