【问题标题】:How would I formulate an insert query into another database using postgres_fdw?如何使用 postgres_fdw 将插入查询公式化到另一个数据库中?
【发布时间】:2017-03-28 03:41:40
【问题描述】:

这是我要运行的查询 - 假设我在其中运行此查询的当前数据库是 db1,我要在其中插入记录的数据库是 db2。

  insert into db2.employee(id, name, group) values(id, <db1.employee.name>, <db1.employee.group>) where id in (select id from archived limit 2);

如您所见,这些值必须从 db1(当前数据库)的员工表中选择,然后插入到 db2 的员工表中。

我知道查询是错误的 - 但我刚刚写信是为了解释我想要做什么。

如何使用 postgres_fdw 制定查询?

我尝试过使用这个查询做一些相反的事情

INSERT INTO  employee select * from 
dblink('host=10.1.1.1
 user=user
 password=password
 dbname=mydb', 'select * from employee') tt(
       id int,
  name character varying,
 );

编辑:请注意,我想做一个远程插入和一个本地选择。 当我在 db2 中作为本地数据库而不是 db1 运行查询时,似乎可以使用上面的查询来实现这一点

【问题讨论】:

    标签: database postgresql postgres-fdw


    【解决方案1】:

    您不能像在 MySQL 中那样直接访问不同数据库中的表(一个 MySQL database 对应一个 PostgreSQL schema)。

    因此,也许您可​​以通过在单个数据库中使用不同的模式来实现您想要的。

    如果您确实需要更新不同数据库中的表,则必须使用 postgres_fdw 外部数据包装器来访问外部表。

    您必须在数据库db1 中定义一个外部表——我们称之为foreign_employee,它指向db2 中的一个表。

    那么你可以这样做:

    INSERT INTO foreign_employee
    SELECT e.*
    FROM employee e
         JOIN archived a USING id
    LIMIT 2;
    

    请注意,LIMIT 在这里有点奇怪,因为查询结果中没有隐含的顺序,除非您强制使用 ORDER BY

    【讨论】:

    • 然后将行插入到实际表中 - 外部表中的 db2.employee - 怎么做?
    • db2.employee 外表,不是吗?如果要插入两个表,请使用 WITH x AS (INSERT ... RETURNING ...) INSERT ... SELECT ... FROM x
    • db2.employee 是一个实际的表 - 它存在于 db2 中。它与 db1.employee 具有相同的架构
    • 我是否需要一个外部表,即使我在 db2 中有该表的精确副本?
    • 我已经用编辑 1 更新了我的问题,以进一步解释我想要做什么
    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2020-04-28
    相关资源
    最近更新 更多