Postgreql: 插入到... (选择 * ...)

我不确定它的标准 SQL:

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

我要找的是: 如果 tblA 和 tblB 位于不同的 DB 服务器中会怎样

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

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

编辑:
如果不可能,那么我将从 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');

有没有可能用这个创建一个事先准备好的语句

656574 次浏览

可以使用 眨眼创建在另一个数据库中解析的视图。此数据库可能位于另一台服务器上。

正如 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;'
);

我不喜欢嵌套的闪烁,但 AFAIK 我不能参考在 Dblink _ exec体 tblB。使用 LIMIT 指定前20行,但我认为您需要首先使用 ORDERBY 子句对它们进行排序。

如果要插入指定列:

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

这个符号(首次见到 给你)看起来也很有用:

insert into postagem (
resumopostagem,
textopostagem,
dtliberacaopostagem,
idmediaimgpostagem,
idcatolico,
idminisermao,
idtipopostagem
) select
resumominisermao,
textominisermao,
diaminisermao,
idmediaimgminisermao,
idcatolico ,
idminisermao,
1
from
minisermao

这里有一个不使用 dblink的替代解决方案。

假设 B 表示源数据库,A 表示目标数据库: 然后,

  1. 将表从源数据库复制到目标数据库:

    pg_dump -t <source_table> <source_db> | psql <target_db>
    
  2. Open psql prompt, connect to target_db, and use a simple insert:

    psql
    # \c <target_db>;
    # INSERT INTO <target_table>(id, x, y) SELECT id, x, y FROM <source_table>;
    
  3. At the end, delete the copy of source_table that you created in target_table.

    # DROP TABLE <source_table>;
    
insert into TABLENAMEA (A,B,C,D)
select A::integer,B,C,D from TABLENAMEB

如果要查找 表演,请在数据库链接查询中给出条件位置。 否则,它将从外表中获取所有数据并应用 where 条件。

INSERT INTO tblA (id,time)
SELECT id, time FROM  dblink('dbname=dbname port=5432 host=10.10.90.190 user=postgresuser password=pass123',
'select id, time from tblB  where time>'''||1000||'''')
AS t1(id integer, time integer)

我将从 Database _ Two (10.0.0.20)访问 SELECT Database _ One (10.0.0.10)数据

连接到10.0.0.20并创建 DBLink 扩展:

CREATE EXTENSION dblink;

测试 Database _ One 的连接:

SELECT dblink_connect('host=10.0.0.10 user=postgres password=dummy dbname=DB_ONE');

为全局身份验证创建外部数据包装器和服务器:

CREATE FOREIGN DATA WRAPPER postgres VALIDATOR postgresql_fdw_validator;

可以将此服务器对象用于跨数据库查询:

CREATE SERVER dbonepostgres FOREIGN DATA WRAPPER postgres OPTIONS (hostaddr '10.0.0.10', dbname 'DB_ONE');

用户和服务器的映射:

CREATE USER MAPPING FOR postgres SERVER dbonepostgres OPTIONS (user 'postgres', password 'dummy');

测试 dblink:

SELECT dblink_connect('dbonepostgres');

将数据从10.0.0.10导入到10.0.0.20

INSERT INTO tableA
SELECT
column1,
,column2,
...
FROM dblink('dbonepostgres', 'SELECT column1, column2, ... from public.tableA')
AS data(column1 DATATYPE, column2 DATATYPE, ...)
;