一个外部表
是一个数据库对象,它表示存在于外部数据源(可能是另一个 PostgreSQL 节点或完全不同的系统)上的表,并通过外部数据包装器
(FDW) 访问。
外部表
可以像普通表一样查询,并且根据 FDW 实现,可以使用INSERT
、UPDATE
和DELETE
命令进行修改。但是,与本机 PostgreSQL 表相比,外部表提供的灵活性与性能之间存在权衡。
外部表
从PostgreSQL 9.1开始可用。
创建外部表
在创建外部表
之前,必须安装相应的外部数据包装器
,并创建一个外部服务器
来定义到远程数据源的连接。通常还需要用户映射
,它允许本地 PostgreSQL 用户访问远程数据源。
在定义外部表
时,可以提供表和列级别的选项,这些选项通常可以将 PostgreSQL 中的表/列名称映射到远程数据源上的名称,并且根据 FDW 实现,还可以指定其他设置,例如远程表是否可以更新。
还可以使用IMPORT FOREIGN SCHEMA
命令从远程数据源自动导入外部表,尽管这取决于远程数据源是否适合此类操作(例如,对于基于文件的file_fdw
从文件中提取架构是不可行的)以及各个FDW
提供的实现。
外部表作为分区
从PostgreSQL 11开始,外部表
可以作为分区表附加,尽管存在某些限制/约束
- 该外部数据包装器必须支持
元组路由
- 无法验证
外部表
中的所有行是否都遵守分区约束 - 如果父表上存在任何唯一索引,则无法创建/附加
外部表
作为父表的子分区 - 可以将行从本地分区移动到
外部表
分区,但不能将它们从外部表分区移动到另一个分区
转储外部表数据
从PostgreSQL 13开始,pg_dump
可以使用--include-foreign-data
选项选择性地转储外部表中的数据。
限制
- 在PostgreSQL 13及更早版本中,无法使用
TRUNCATE
命令从外部表中删除数据。 - 在PostgreSQL 15及更早版本中,无法在外部表上创建
TRUNCATE
触发器 - 无法使用外部表作为
MERGE
操作的目标关系
示例
使用postgres_fdw
创建简单的“环回”外部表,该表实际上引用同一服务器上的表
postgres=# CREATE EXTENSION postgres_fdw; CREATE EXTENSION postgres=# CREATE SERVER fdw_test FOREIGN DATA WRAPPER postgres_fdw OPTIONS ( host 'localhost', port '5432', dbname 'postgres' ); postgres=# CREATE USER MAPPING FOR CURRENT_USER SERVER fdw_test OPTIONS(user 'postgres'); CREATE USER MAPPING postgres=# CREATE FOREIGN TABLE bar ( f_id INT OPTIONS (column_name 'id') NOT NULL, f_val TEXT OPTIONS (column_name 'val') ) SERVER fdw_test OPTIONS (table_name 'foo'); CREATE FOREIGN TABLE postgres=# \det List of foreign tables Schema | Table | Server --------+-------------+---------- public | bar | fdw_test (1 row) postgres=# \d bar Foreign table "public.bar" Column | Type | Collation | Nullable | Default | FDW options --------+---------+-----------+----------+---------+--------------------- f_id | integer | | not null | | (column_name 'id') f_val | text | | | | (column_name 'val') Server: fdw_test FDW options: (table_name 'foo')
参考
- PostgreSQL 文档: 外部数据