我有两个postgresql数据库,一个在我的本地机器上,一个在远程机器上。如果我已连接到本地数据库(使用psql),如何通过从本地数据库中的表中选择行来执行将行插入远程数据库中的表的语句? (我已经看过几次这样的问题,比如here,here和here,但我还没有找到一个满意的答案或任何人明确地说它是不可能的。)
具体来说,假设我有表可远程访问和本地表,每个表都有一个列columnA。我可以成功运行此声明:
select dblink_exec('myconnection', 'insert into remotetable (columnA) values (1);');
但我想做的是:
select dblink_exec('myconnection', 'insert into remotetable (columnA) select columnA from localtable;');
但这失败了: relation" localtable"不存在,大概是因为远程数据库上不存在localtable。
我可以做我想做的事情吗?如果是这样,我如何表明本地表实际上是本地的?我在dblink-exec看到的所有示例都显示了带有静态值的插入,而不是本地查询的结果。
注意:我知道如何从远程表中查询数据并插入本地表,但我试图向另一个方向移动数据。
答案 0 :(得分:1)
如果是这样,我如何表明本地表实际上是本地的?
这是不可能的,因为dblink
充当远程服务器的SQL客户端。这就是为什么通过dblink_exec
发送的查询必须是自包含的:它们只能执行任何SQL应用程序发送的任何其他查询。从服务器的角度来看,查询中的每个对象都是本地对象。
也就是说,除非您使用其他功能,否则使用postgres_fdw驱动程序的外部数据包装。这是一种更复杂的方法来实现服务器到服务器的查询,其中SQL引擎本身具有外部和本地表的概念。