一、问题场景
在使用 PostgreSQL 创建表时,遇到了错误提示:ERROR: cross-database references are not implemented: "dyzw_ft.public.__cc_tx_de_cycle"
。该问题出现在尝试引用其他数据库中的表时,PostgreSQL 不支持直接跨数据库操作。
二、问题环境
软件 | 版本 |
---|---|
PostgreSQL | 12 |
DataGrip | 2024.2 |
三、问题原因
PostgreSQL 默认不支持跨数据库的引用操作。在 SQL 语句中,明确指定了 "test".public."__cc_tx_de_cycle"
,其中 "test"
是一个数据库名,而 PostgreSQL 并未实现跨数据库的直接引用功能,因此抛出了上述错误。
四、解决方案
- 检查是否需要跨数据库操作
如果不需要跨数据库操作,可以去掉数据库名 ,直接创建表在当前数据库的public
模式下:
create table public."__cc_tx_de_cycle" (
"id" bigint not null,
"val" bigint null,
constraint "__cc_tx_de_cycle_pkey" primary key("id")
);
- 使用 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);
- 使用外部表(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');
- 将数据迁移到同一数据库
如果长期需要访问另一数据库的数据,可以考虑将目标表从源数据库迁移到当前数据库中:
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
五、结果
通过上述方法之一解决了跨数据库引用的问题。如果只是误写数据库名,则直接修改为当前数据库模式即可;如果是真正需要跨数据库操作,则可以通过 dblink
或 postgres_fdw
实现需求。
六、总结
PostgreSQL 不支持直接跨数据库引用操作,这是其设计限制。遇到类似问题时,应首先确认是否真的需要跨数据库操作。如果不必要,则调整表的创建位置;如果必要,则可以借助扩展工具如 dblink
或 postgres_fdw
来实现需求。此外,对于长期依赖的数据,建议将相关表迁移到同一数据库中以简化操作。
PS:随缘求赞、关注
如果我的文章对大家产生了帮助,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注;
也可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!