一、问题场景

在使用 PostgreSQL 创建表时,遇到了错误提示:ERROR: cross-database references are not implemented: "dyzw_ft.public.__cc_tx_de_cycle"。该问题出现在尝试引用其他数据库中的表时,PostgreSQL 不支持直接跨数据库操作。

二、问题环境

软件版本
PostgreSQL12
DataGrip2024.2

三、问题原因

PostgreSQL 默认不支持跨数据库的引用操作。在 SQL 语句中,明确指定了 "test".public."__cc_tx_de_cycle",其中 "test" 是一个数据库名,而 PostgreSQL 并未实现跨数据库的直接引用功能,因此抛出了上述错误。

四、解决方案

  1. 检查是否需要跨数据库操作
    如果不需要跨数据库操作,可以去掉数据库名 ,直接创建表在当前数据库的 public 模式下:
create table public."__cc_tx_de_cycle" (
"id" bigint not null,
"val" bigint null,
constraint "__cc_tx_de_cycle_pkey" primary key("id")
);  
  1. 使用 dblink 扩展
    如果确实需要跨数据库操作,可以启用并使用 dblink 扩展来查询或操作远程数据库中的表:
CREATE EXTENSION dblink;
SELECT * FROM dblink('host=localhost dbname=test user=your_user password=your_password',
'SELECT * FROM public."__cc_tx_de_cycle"')
AS t1(id bigint, val bigint);  
  1. 使用外部表(Foreign Data Wrapper, FDW)
    使用 postgres_fdw 扩展创建外部表以频繁访问另一个数据库中的数据:
CREATE EXTENSION postgres_fdw;
CREATE SERVER foreign_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', dbname 'test');
CREATE USER MAPPING FOR current_user SERVER foreign_server OPTIONS (user 'your_user', password 'your_password');
CREATE FOREIGN TABLE foreign_table (
id bigint not null,
val bigint null
) SERVER foreign_server OPTIONS (schema_name 'public', table_name '__cc_tx_de_cycle');  
  1. 将数据迁移到同一数据库
    如果长期需要访问另一数据库的数据,可以考虑将目标表从源数据库迁移到当前数据库中:
pg_dump -h localhost -U your_user -d dyzw_ft -t public.__cc_tx_de_cycle > table_dump.sql
psql -h localhost -U your_user -d your_current_db -f table_dump.sql 

五、结果

通过上述方法之一解决了跨数据库引用的问题。如果只是误写数据库名,则直接修改为当前数据库模式即可;如果是真正需要跨数据库操作,则可以通过 dblinkpostgres_fdw 实现需求。

六、总结

PostgreSQL 不支持直接跨数据库引用操作,这是其设计限制。遇到类似问题时,应首先确认是否真的需要跨数据库操作。如果不必要,则调整表的创建位置;如果必要,则可以借助扩展工具如 dblinkpostgres_fdw 来实现需求。此外,对于长期依赖的数据,建议将相关表迁移到同一数据库中以简化操作。

PS:随缘求赞、关注

如果我的文章对大家产生了帮助,可以在文章底部点个赞或者收藏;

如果有好的讨论,可以留言;

如果想继续查看我以后的文章,可以点击关注;

也可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!