小编典典

postgresql: INSERT INTO ... (SELECT * ...)

all

我不确定它是否是标准 SQL:

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

我正在寻找的是:如果 tblA 和 tblB 在不同的 DB Servers 中会怎样

PostgreSql 是否提供任何实用程序或具有任何有助于使用的功能INSERT query with PGresult struct

我的意思是会在 using 上SELECT id, time FROM tblB ...返回一个。是否可以在另一个结构中使用此结构来执行 INSERT 命令。 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'); 

是否有可能从中创建一个准备好的声明!:(


阅读 75

收藏
2022-08-15

共1个答案

小编典典

正如 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 子句对它们进行排序。

2022-08-15