我不确定它是否是标准 SQL:
INSERT INTO tblA (SELECT id, time FROM tblB WHERE time > 1000)
我正在寻找的是:如果 tblA 和 tblB 在不同的 DB Servers 中会怎样。
PostgreSql 是否提供任何实用程序或具有任何有助于使用的功能INSERT query with PGresult struct
INSERT query with PGresult struct
我的意思是会在 using 上SELECT id, time FROM tblB ...返回一个。是否可以在另一个结构中使用此结构来执行 INSERT 命令。 PGresult*``PQexec``PQexec
SELECT id, time FROM tblB ...
PGresult*``PQexec``PQexec
编辑: 如果不可能,那么我会从 PQresult* 中提取值并创建多个 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');
是否有可能从中创建一个准备好的声明!:(
正如 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 具有记录伪类型(仅适用于函数的参数或结果类型),它允许您从另一个(未知)表中查询数据。
编辑:
如果需要,您可以将其作为准备好的语句,并且它也可以:
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;
编辑(是的,另一个):
如果我的理解是正确的(postgres 有 tbla 并且 dbtest 有 tblb 并且您希望使用本地选择进行远程插入,而不是使用上面的本地插入进行远程选择):
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,但我无法在dblink_exec正文中引用 tblB。使用 LIMIT 指定前 20 行,但我认为您需要先使用 ORDER BY 子句对它们进行排序。