可以用PostgreSQL执行跨数据库查询吗?

sql postgresql

168300 观看

8回复

112176 作者的声誉

我将根据以下错误消息(以及此Google结果)猜测答案为“否” ,但无论如何使用PostgreSQL执行跨数据库查询?

databaseA=# select * from databaseB.public.someTableName;
ERROR:  cross-database references are not implemented:
 "databaseB.public.someTableName"

我正在处理一些跨两个数据库分区的数据,尽管两者之间真的共享数据(一个数据库中的userid列来自另一个数据库中的users表)。我不知道为什么这些是两个独立的数据库而不是架构,但是c'est la vie ...

作者: matt b 的来源 发布者: 2008 年 9 月 5 日

回应 (8)


20

23614 作者的声誉

在你得到关于跨数据库查询的相同结论之前,我遇到了这个问题。我最终做的是使用模式来划分表空间,这样我可以保持表分组,但仍然查询它们。

作者: stimms 发布者: 05.09.2008 05:17

95

20835 作者的声誉

决定

注意:正如原始提问者暗示的那样,如果您在同一台计算机上设置两个数据库,则可能需要制作两个模式 - 在这种情况下,您不需要任何特殊的查询。

自9.3起更新

您现在可以使用新的postgres_fdw(外部数据包装器)连接到任何Postgres数据库中的表 - 本地或远程。

请注意,其他常用数据源外部数据包装器。在这个时候,只有postgres_fdwfile_fdw是正式的Postgres发布的一部分。

9.3之前的原始答案

此功能不是默认PostgreSQL安装的一部分,但您可以将其添加。它被调用dblink

我从来没有使用它,但它与PostgreSQL的其余部分一起维护和分发。如果您使用的是Linux发行版附带的PostgreSQL版本,则可能需要安装名为postgresql-contrib的软件包。

作者: Neall 发布者: 05.09.2008 06:10

2

822 作者的声誉

如果性能很重要且大多数查询都是只读的,我建议将数据复制到另一个数据库。虽然这似乎是不必要的重复数据,但如果需要索引可能会有所帮助。

这可以通过简单的插入触发器来完成,而触发器又调用dblink来更新另一个副本。还有完整的复制选项(如Slony),但这是偏离主题的。

作者: dpavlin 发布者: 12.09.2008 03:56

5

0 作者的声誉

是的,您可以使用DBlink(仅限postgresql)和DBI-Link(允许外部跨数据库查询器)和TDS_LInk,它允许对MS SQL服务器运行查询。

我之前使用过DB-Link和TDS-link取得了巨大的成功。

作者: snorkel 发布者: 22.09.2008 05:47

10

30038 作者的声誉

只是添加更多信息。

无法查询当前数据库以外的数据库。因为PostgreSQL加载特定于数据库的系统目录,所以不确定跨数据库查询应该如何表现。

contrib / dblink允许使用函数调用进行跨数据库查询。当然,客户端也可以同时连接到不同的数据库,并在客户端合并结果。

PostgreSQL FAQ

作者: Esteban Küber 发布者: 06.05.2010 09:10

16

18690 作者的声誉

dblink() - 在远程数据库中执行查询

dblink在远程数据库中执行查询(通常是SELECT,但它可以是返回行的任何SQL语句)。

当给出两个文本参数时,第一个参数首先被查找为持久连接的名称; 如果找到,则在该连接上执行该命令。如果未找到,则将第一个参数视为与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

作者: Manwal 发布者: 21.11.2014 04:29

0

3761 作者的声誉

如果有人需要更多涉及如何进行跨数据库查询的示例,这里有一个示例清理databasechangeloglock每个拥有它的数据库上的表:

CREATE EXTENSION IF NOT EXISTS dblink;

DO 
$$
DECLARE database_name TEXT;
DECLARE conn_template TEXT;
DECLARE conn_string TEXT;
DECLARE table_exists Boolean;
BEGIN
    conn_template = 'user=myuser password=mypass dbname=';

    FOR database_name IN
        SELECT datname FROM pg_database
        WHERE datistemplate = false
    LOOP
        conn_string = conn_template || database_name;

        table_exists = (select table_exists_ from dblink(conn_string, '(select Count(*) > 0 from information_schema.tables where table_name = ''databasechangeloglock'')') as (table_exists_ Boolean));
        IF table_exists THEN
            perform dblink_exec(conn_string, 'delete from databasechangeloglock');
        END IF;     
    END LOOP;

END
$$
作者: Haroldo_OK 发布者: 12.04.2019 01:58

0

36 作者的声誉

我已经检查并尝试使用dblinkpostgres_fdw在2个不同的数据库中创建2个表之间的外键关系但没有结果。

阅读了其他人对此的反馈,例如此处此处以及其他一些来源,看起来目前没有办法做到这一点:

DBLINKpostgres_fdw确实使人们能够连接其他数据库中,这是不可能与标准的Postgres和查询表,但他们不允许建立在不同的数据库表之间的外键关系。

作者: Rocckk 发布者: 12.07.2019 01:32
32x32