我不确定它是否是标准的SQL:
INSERT INTO tblA
(SELECT id, time
FROM tblB
WHERE time > 1000)
我正在寻找的是:如果tblA和tblB在不同的数据库服务器中会怎样。
PostgreSql是否提供任何实用程序或具有任何有助于使用INSERT query with PGresult struct
我的意思是SELECT id, time FROM tblB ...
将使用PGresult*
返回PQexec
。是否可以在另一个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');
是否有可能从中创建一个准备好的声明!! :(
答案 0 :(得分:126)
正如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有record伪类型(仅用于函数的参数或结果类型),它允许您从另一个(未知)表中查询数据。
编辑:
如果您愿意,可以将其作为预备语句,并且也可以使用:
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;
编辑(是的,另一个):
我刚刚看到你的revised question(关闭为重复,或者与此非常相似)。
如果我的理解是正确的(postgres有tbla和dbtest有tblb,你想要远程插入本地选择,而不是远程选择本地插入,如上所述):< / p>
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子句对它们进行排序。
答案 1 :(得分:22)
如果要插入指定列:
INSERT INTO table (time)
(SELECT time FROM
dblink('dbname=dbtest', 'SELECT time FROM tblB') AS t(time integer)
WHERE time > 1000
);
答案 2 :(得分:9)
您可以使用dblink创建在另一个数据库中解析的视图。该数据库可能位于另一台服务器上。
答案 3 :(得分:8)
这种表示法(首次见here)看起来也很有用:
insert into postagem (
resumopostagem,
textopostagem,
dtliberacaopostagem,
idmediaimgpostagem,
idcatolico,
idminisermao,
idtipopostagem
) select
resumominisermao,
textominisermao,
diaminisermao,
idmediaimgminisermao,
idcatolico ,
idminisermao,
1
from
minisermao
答案 4 :(得分:1)
这是替代解决方案,无需使用 dblink
。
假设B代表源数据库,而A代表目标数据库: 然后,
将表从源数据库复制到目标数据库:
pg_dump -t <source_table> <source_db> | psql <target_db>
打开psql提示符,连接到 target_db ,然后使用简单的insert
:
psql
# \c <target_db>;
# INSERT INTO <target_table>(id, x, y) SELECT id, x, y FROM <source_table>;
最后,删除您在 target_table 中创建的 source_table 的副本。
# DROP TABLE <source_table>;
答案 5 :(得分:0)
insert into TABLENAMEA (A,B,C,D)
select A::integer,B,C,D from TABLENAMEB
答案 6 :(得分:0)
如果您正在寻找性能,请在数据库链接查询中提供 where 条件。 否则,它将从外部表中获取所有数据并应用 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)