↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1
历史版本PostgreSQL 10 已于 2022 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CREATE FOREIGN TABLE

CREATE FOREIGN TABLE — 定义一个新外部表

大纲

CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [
  { column_name data_type [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ]
    | table_constraint }
    [, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
  SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]

CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name
  PARTITION OF parent_table [ (
  { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
    | table_constraint }
    [, ... ]
) ]
  FOR VALUES partition_bound_spec
  SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]

其中column_constraint为:

[ CONSTRAINT constraint_name ]
{ NOT NULL |
  NULL |
  CHECK ( expression ) [ NO INHERIT ] |
  DEFAULT default_expr }

而table_constraint为:

[ CONSTRAINT constraint_name ]
CHECK ( expression ) [ NO INHERIT ]

而partition_bound_spec为:

IN ( { numeric_literal | string_literal | TRUE | FALSE | NULL } [, ...] ) |
FROM ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] )
  TO ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] )

描述

CREATE FOREIGN TABLE将在当前数据库中创建一个新的外部表。该表归发出该命令的用户所有。

如果给出了模式名(例如 CREATE FOREIGN TABLE myschema.mytable ...),则表将在指定模式中创建。否则,它将在当前模式中创建。外部表名必须与同一模式中任何其他外部表、表、序列、索引、视图或物化视图的名称不同。

CREATE FOREIGN TABLE还会自动创建一种数据类型,用以表示与该外部表一行对应的复合类型。因此,外部表名不能与同一模式中任何已有数据类型同名。

如果指定了PARTITION OF子句,则该表会按指定边界创建为parent_table的一个分区。

要创建外部表,必须拥有该外部服务器上的USAGE权限,以及表中所用所有列类型上的USAGE权限。

参数

IF NOT EXISTS

已经存在同名关系时不要抛出错误。这种情况下会发出一个提示。注意,已存在的关系不保证与原本将要创建的关系有任何相似之处。

table_name

要创建的表名(可选地带有模式限定)。

column_name

要在新表中创建的列名。

data_type

该列的数据类型,可以包含数组说明符。有关PostgreSQL支持的数据类型的更多信息,参见第 8 章。

COLLATE collation

COLLATE子句为列指定排序规则(该列必须属于支持排序规则的数据类型)。如果未指定,则使用列数据类型的默认排序规则。

INHERITS ( parent_table [, ... ] )

可选的 INHERITS 子句指定一个表列表,新创建的外部表将自动继承这些表的所有列。父表可以是普通表或外部表。有关更多详细信息,请参阅CREATE TABLE的类似形式。

PARTITION OF parent_table FOR VALUES partition_bound_spec

这种形式可用于将外部表创建为给定父表的一个分区,并为其指定分区边界值。有关更多详细信息,请参阅CREATE TABLE的类似形式。

CONSTRAINT constraint_name

列约束或表约束的可选名称。如果约束被违反,错误消息中会包含该约束名,因此诸如col must be positive这样的约束名可以向客户端应用传达有用的约束信息。(若约束名中包含空格,则需要用双引号指定。)如果未指定约束名,系统会生成一个。

NOT NULL

该列不允许包含空值。

NULL

该列允许包含空值。这是默认情况。

该子句仅为兼容非标准 SQL 数据库而提供,不建议在新应用中使用。

CHECK ( expression ) [ NO INHERIT ]

CHECK子句指定一个产生布尔结果的表达式,外部表中的每一行都应满足该表达式;也就是说,对于外部表中的所有行,该表达式都应产生 TRUE 或 UNKNOWN,而绝不能产生 FALSE。作为列约束指定的检查约束只应引用该列的值,而出现在表约束中的表达式可以引用多个列。

当前,CHECK表达式不能包含子查询,也不能引用当前行的列之外的变量。可以引用系统列tableoid,但不能引用其他系统列。

标记为NO INHERIT的约束不会传播到子表。

DEFAULT default_expr

DEFAULT子句为包含它的列定义所对应的列指定默认数据值。该值可以是任何不含变量的表达式(不允许包含子查询或对当前表中其他列的交叉引用)。默认表达式的数据类型必须与列的数据类型匹配。

默认值表达式会用于任何未为该列指定值的插入操作。如果一列没有默认值,则默认值为 null。

server_name

要用于外部表的现有外部服务器的名称。有关定义服务器的详细信息,请参阅CREATE SERVER。

OPTIONS ( option 'value' [, ...] )

要与新外部表或其某一列关联的选项。允许的选项名和值都取决于具体的外部数据包装器,并使用该外部数据包装器的验证器函数进行验证。不允许重复的选项名(不过表选项和列选项同名是允许的)。

注解

核心PostgreSQL系统不会强制执行外部表上的约束(例如CHECK或NOT NULL子句),而且大多数外部数据包装器也不会尝试强制执行它们;也就是说,这些约束只是被假定为真。因为这种强制执行只会适用于通过外部表插入或更新的行,而不会适用于通过其他方式修改的行,例如直接在远程服务器上修改的行,所以这样做意义不大。相反,附加到外部表上的约束应当表示由远程服务器强制执行的约束。

某些专用的外部数据包装器可能是其所访问数据的唯一访问机制,在这种情况下,由外部数据包装器自身执行约束检查也许是合适的。但除非其文档明确说明,否则不应假定某个包装器会这样做。

尽管PostgreSQL不会尝试强制执行外部表上的约束,但出于查询优化的目的,它会假定这些约束是正确的。如果外部表中存在不满足已声明约束的可见行,那么对该表的查询可能会产生不正确的结果。确保约束定义符合实际情况是用户的责任。

尽管可以将外部表指定为分区,但不支持将元组路由到外部表分区。

示例

创建通过服务器film_server访问的外部表films:

CREATE FOREIGN TABLE films (
    code        char(5) NOT NULL,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
)
SERVER film_server;

创建通过服务器server_07访问的外部表measurement_y2016m07,并将其作为范围分区表measurement的一个分区:

CREATE FOREIGN TABLE measurement_y2016m07
    PARTITION OF measurement FOR VALUES FROM ('2016-07-01') TO ('2016-08-01')
    SERVER server_07;

兼容性

CREATE FOREIGN TABLE命令基本符合SQL标准;但是,与CREATE TABLE一样,它允许使用NULL约束,也允许零列外部表。指定列默认值的能力也是PostgreSQL的扩展。按PostgreSQL定义的形式,表继承是非标准的。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。