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的视图。 该数据库可能位于另一台服务器上。