首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >postgresql:插入到...(SELECT * ...)

postgresql:插入到...(SELECT * ...)
EN

Stack Overflow用户
提问于 2011-05-22 00:50:37
回答 7查看 535.2K关注 0票数 164

我不确定它的标准SQL:

代码语言:javascript
运行
复制
 INSERT INTO tblA 
 (SELECT id, time 
    FROM tblB 
   WHERE time > 1000)  

我正在寻找的是:如果tblA和tblB在不同的数据库服务器中怎么办。

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

我的意思是,在使用PQexec时,SELECT id, time FROM tblB ...会返回一个PGresult*。是否可以在另一个PQexec中使用此结构来执行插入命令。

编辑:

如果不可能,我会从PQresult*中提取值,并创建一个多插入语句语法,如下所示:

代码语言:javascript
运行
复制
INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'); 

有没有可能用它来创建预准备语句!!:(

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-05-22 01:53:40

正如Henrik所写的,你可以使用dblink连接远程数据库并获取结果。例如:

代码语言:javascript
运行
复制
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伪类型(仅用于函数的参数或结果类型),它允许您从另一个(未知)表中查询数据。

编辑:

如果需要,您可以将其设置为预准备语句,并且它也可以正常工作:

代码语言:javascript
运行
复制
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,而您希望使用local select的remote insert,而不是如上所述使用local insertremote select ):

代码语言:javascript
运行
复制
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 body中引用tblB。使用LIMIT指定前20行,但我认为您需要首先使用ORDER BY子句对它们进行排序。

票数 184
EN

Stack Overflow用户

发布于 2015-02-02 21:08:07

如果要插入到指定列中:

代码语言:javascript
运行
复制
INSERT INTO table (time)
(SELECT time FROM 
    dblink('dbname=dbtest', 'SELECT time FROM tblB') AS t(time integer) 
    WHERE time > 1000
);
票数 48
EN

Stack Overflow用户

发布于 2018-02-07 08:16:51

这个符号(首先看到的是here)看起来也很有用:

代码语言:javascript
运行
复制
insert into postagem (
  resumopostagem,
  textopostagem,
  dtliberacaopostagem,
  idmediaimgpostagem,
  idcatolico,
  idminisermao,
  idtipopostagem
) select
  resumominisermao,
  textominisermao,
  diaminisermao,
  idmediaimgminisermao,
  idcatolico ,
  idminisermao,
  1
from
  minisermao    
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6083132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档