创建外表

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

Synopsis

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 }
    [, ... ]
) ] partition_bound_spec
  SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]

where column_constraint is:

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

and table_constraint is:

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

Description

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

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

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

如果指定了PARTITION OF子句,则表将作为具有指定范围的parent_table的分区创建。

为了能够创建外部表,您必须在外部服务器上具有USAGE特权,并且对该表中使用的所有列类型都具有USAGE特权。

Parameters

  • IF NOT EXISTS

    • 如果已经存在同名关系,则不要抛出错误。在这种情况下发出通知。请注意,不能保证现有关系类似于将要创建的关系。
  • table_name

    • 要创建的表的名称(可选的模式限定)。
  • column_name

    • 要在新表中创建的列的名称。
  • data_type

    • 列的数据类型。这可以包括数组说明符。有关 PostgreSQL 支持的数据类型的更多信息,请参考Chapter 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之类的约束名称来将有用的约束信息传达给 Client 端应用程序。 (需要双引号指定包含空格的约束名称.)如果未指定约束名称,则系统将生成一个名称。
  • 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' [, ...] )

    • 与新的外部表或其列之一关联的选项。允许的选项名称和值特定于每个外部数据包装器,并使用外部数据包装器的验证器功能进行验证。不允许使用重复的选项名称(尽管表选项和列选项具有相同的名称是可以的)。

Notes

外部 PostgreSQL 表的约束(例如CHECKNOT NULL子句)不是由核心 PostgreSQL 系统强制执行的,并且大多数外部数据包装程序也不尝试强制执行这些约束。也就是说,仅假定约束为真。这样的执行几乎没有意义,因为它仅适用于通过外部表插入或更新的行,而不适用于通过其他方式(例如直接在远程服务器上)修改的行。而是,附加到外部表的约束应表示由远程服务器强制实施的约束。

某些特殊用途的外部数据包装器可能是对其访问的数据的唯一访问机制,在这种情况下,外部数据包装器本身可能会执行约束强制。但是,除非其文档中有说明,否则您不应该假定包装程序可以这样做。

尽管 PostgreSQL 并未尝试对外部表强制执行约束,但它确实假定它们对于查询优化是正确的。如果外部表中可见的行不满足声明的约束,则对该表的查询可能会产生错误的答案。用户有责任确保约束定义与实际情况匹配。

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

Examples

创建外部表films,它将通过服务器film_server进行访问:

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;

Compatibility

CREATE FOREIGN TABLE命令在很大程度上符合 SQL 标准。但是,与CREATE TABLENULL约束和零列外部表一样,也是允许的。指定列默认值的功能也是 PostgreSQL 扩展。 PostgreSQL 定义的形式的表继承是非标准的。

See Also

更改外表, 下降外表, CREATE TABLE, CREATE SERVER, 导入外国模式