如何使用postgres_fdw将插入查询表示到另一个数据库?

时间:2016-11-14 13:23:52

标签: database postgresql postgres-fdw

以下是我要运行的查询 - 让我运行此查询的当前数据库是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(当前数据库)的employee表中选择值,然后将其插入db2的employee表中。

我知道查询是错误的 - 但我刚刚写了解释我要做的事情。

如何使用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

时,似乎我能够使用上面的查询来实现这一点

1 个答案:

答案 0 :(得分:2)

您无法像在MySQL中那样直接访问其他数据库中的表(MySQL 数据库对应于PostgreSQL 架构)。

所以也许你可以通过在一个数据库中使用不同的模式来实现你想要的。

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

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

然后你可以这样做:

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

请注意LIMIT在这里有点奇怪,因为除非你强制使用ORDER BY,否则查询结果中没有隐式顺序。