可以使用postgres执行跨数据库查询?
我会猜测答案是不是基于下面的错误消息(和这个谷歌的结果 ),但有无论如何执行使用Postgres的跨数据库查询?
databaseA=# select * from databaseB.public.someTableName; ERROR: cross-database references are not implemented: "databaseB.public.someTableName"
我正在处理跨两个数据库分区的一些数据,尽pipe数据实际上是在两者之间共享的(一个数据库中的userid列来自另一个数据库中的users
表)。 我不知道为什么这些是两个单独的数据库,而不是模式,但c'est la vie …
注意:正如最初的提问者所暗示的,如果你在同一台机器上设置了两个数据库,你可能需要创build两个模式 – 在这种情况下,你不需要任何特殊的查询。
更新至9.3
您现在可以使用新的postgres_fdw
(外部数据包装器)连接到任何Postgres数据库中的表 – 本地或远程表。
请注意,有其他stream行的数据源的外国数据包装 。 目前,只有postgres_fdw
和file_fdw
是Postgres官方发行版的一部分。
9.3之前的原始答案
这个function不是默认的PostgreSQL安装的一部分,但是你可以添加它。它被称为dblink
。
我从来没有使用过它,但它是保留和分布在PostgreSQL的其余部分。 如果您使用的是Linux发行版附带的PostgreSQL版本,则可能需要安装名为postgresql-contrib的软件包。
我已经遇到了这个问题,然后才得出与您一样的关于跨数据库查询的相同结论。 我最终做的是使用模式来分割表空间的方式,我可以保持表分组,但仍然查询他们所有。
只是添加更多的信息。
没有办法查询当前数据库以外的数据库。 由于PostgreSQL加载特定于数据库的系统目录,所以跨数据库查询甚至应该如何performance也是不确定的。
contrib / dblink允许使用函数调用进行跨数据库查询。 当然,客户端也可以同时连接到不同的数据库,并将结果合并到客户端。
PostgreSQL FAQ
dblink() – 在远程数据库中执行查询
dblink在远程数据库中执行一个查询(通常是一个SELECT,但它可以是任何返回行的SQL语句)。
当给出两个文本参数时,第一个被首先查找为一个持久连接的名字; 如果find,则在该连接上执行该命令。 如果没有find,第一个参数将被视为连接信息string,与dblink_connect相同,并且指定的连接仅在该命令的持续时间内进行。
一个很好的例子:
SELECT * FROM table1 tb1 LEFT JOIN ( SELECT * FROM dblink('dbname=db2','SELECT id, code FROM table2') AS tb2(id int, code text); ) AS tb2 ON tb2.column = tb1.column;
注意:我将这些信息提供给将来参考。 Refrence
是的,您可以使用DBlink(仅限postgresql)和DBI-Link(允许外部交叉数据库查询器)和TDS_LInk(允许查询针对MS SQL服务器运行)。
我以前使用过DB-Link和TDS-link,取得了很大的成功。
如果性能很重要,而且大多数查询是只读的,那么我build议将数据复制到另一个数据库。 虽然这似乎是不必要的数据重复,但如果需要索引,这可能会有所帮助。
这可以通过简单的插入触发器来完成,后者又调用dblink来更新另一个副本。 也有完整的复制选项(如Slony),但这是无关紧要的。