是否可以使用PostgreSQL执行跨数据库查询?

是否可以使用PostgreSQL执行跨数据库查询?,sql,postgresql,Sql,Postgresql,根据下面的错误消息(和),我猜答案是“否”,但是否仍然可以使用PostgreSQL执行跨数据库查询 databaseA=# select * from databaseB.public.someTableName; ERROR: cross-database references are not implemented: "databaseB.public.someTableName" 我正在处理一些跨两个数据库进行分区的数据,尽管数据实际上是在两个数据库之间共享的(一个数据库中的user

根据下面的错误消息(和),我猜答案是“否”,但是否仍然可以使用PostgreSQL执行跨数据库查询

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

我正在处理一些跨两个数据库进行分区的数据,尽管数据实际上是在两个数据库之间共享的(一个数据库中的userid列来自另一个数据库中的
users
表)。我不知道为什么这是两个独立的数据库,而不是模式,但这是人生…

在得出与您相同的关于跨数据库查询的结论之前,我遇到过这个问题。我最后做的是使用模式来划分表空间,这样我可以对表进行分组,但仍然可以查询所有表

注意:正如最初的询问者所暗示的那样,如果您在同一台机器上设置两个数据库,那么您可能希望创建两个数据库——在这种情况下,您不需要任何特殊的东西来跨它们进行查询

postgres\u fdw
使用(外部数据包装器)连接到任何Postgres数据库(本地或远程)中的表

请注意,这里有。目前,只有
postgres\u fdw
file\u fdw
是官方postgres分发的一部分

对于9.3之前的Postgres版本 不再支持这种旧版本,但如果您需要在2013年之前的Postgres安装中执行此操作,则有一个名为的函数


我从未使用过它,但它是与PostgreSQL的其余部分一起维护和分发的。如果您使用的是Linux发行版附带的PostgreSQL版本,您可能需要安装一个名为PostgreSQL contrib的包。

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


这可以通过简单的on insert触发器来完成,该触发器反过来调用dblink来更新另一个副本。还有完整的复制选项(如Slony),但这不是主题。

是的,您可以使用DBlink(仅限postgresql)和DBI Link(允许外部跨数据库查询器)以及TDS_Link,后者允许对MS SQL server运行查询

我以前使用过DB-Link和TDS-Link,非常成功。

只是为了添加更多信息

除当前数据库外,无法查询其他数据库。因为PostgreSQL加载特定于数据库的系统目录,所以不确定跨数据库查询的行为

contrib/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;

注:我提供此信息供将来参考

如果有人需要一个关于如何进行跨数据库查询的更复杂的示例,下面的示例将清理每个数据库上的
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
$$

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

例如,在阅读了其他人对此的反馈后,以及在其他一些来源中,目前似乎没有办法做到这一点:

dblink和postgres_fdw确实可以连接和查询其他数据库中的表,这在标准postgres中是不可能的,但它们不允许在不同数据库中的表之间建立外键关系。

参见[2017年出版]

现在你也可以选择使用

您可以在该PrestoDB节点上运行SQL,它将根据需要分发SQL查询。对于不同的数据库,它可以两次连接到同一节点,也可以连接到不同主机上的不同节点

它不支持:

DELETE
ALTER TABLE
CREATE TABLE (CREATE TABLE AS is supported)
GRANT
REVOKE
SHOW GRANTS
SHOW ROLES
SHOW ROLE GRANTS
因此,您应该仅将其用于选择和加入需求。直接连接到每个数据库以满足上述需求。(看起来您还可以插入或更新,这很好)

客户端应用程序主要使用连接到PrestoDB,但也可以使用其他类型的连接,包括

这是一个由Linux基金会和PrestFoundation管理的开放源码工具。 PrSTO基金会的创始成员是:脸谱网,尤伯, 推特和阿里巴巴

目前的会员有:Facebook、优步、推特、阿里巴巴、Alluxio、, 阿哈娜、厄普索尔弗和英特尔


如果您来自MySQL环境,MySQL所称的数据库实际上是模式(CREATE SCHEMA==在MySQL中创建数据库),因此如果您使用多个数据库从MySQL移植某些内容,请使用模式需要在
dblink
之前安装
postgresql contrib
?或者
postgresql contrib
包括
dblink
?然后OP的查询会起作用,还是你必须以不同的方式进行查询?据我所知,dblink不处理需要跨两个数据库的查询的情况。此附加信息可能会产生误导,并可能不鼓励用户使用上述解决方案。如果dblink不存在,请不要忘记创建扩展
create extension