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

其中,

  • column_constraint是:

    [ CONSTRAINT constraint_name ]
    { NOT NULL |
      NULL |
      CHECK ( expression ) [ NO INHERIT ] |
      DEFAULT default_expr |
      GENERATED ALWAYS AS ( generation_expr ) STORED }
  • table_constraint是:

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

注意事项

  • 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

该列的数据类型。可以包括数组指示符。

COLLATE collation

COLLATE子句为该列(必须是一个可排序的数据类型) 赋予一个排序规则。如果没有指定,则会使用该列的数据类型的默认排序规则。

INHERITS ( parent_table[, ... ] )

可选的INHERITS子句指定了一个表的列表,新的外部表会自动从中继承所有列。父表可以是普通表或者外部表。

PARTITION OF parent_tableFOR VALUES partition_bound_spec

用于将外部表创建为父表的一个指定区间的分区表。

CONSTRAINT constraint_name

一个可选的用于列或者表约束的名字。如果该约束被违背,则该约束名字会出现在错误消息中。约束名col must be positive可以被用来与客户端应用交流有用的约束信息(指定包含空格的约束名需要使用双引号)。如果没有指定约束名,系统会自动生成。

NOT NULL

该列不允许包含空值。

NULL

该列可以包含空值,为默认值。

CHECK ( expression) [ NO INHERIT ]

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

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

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

说明

该子句只是为了兼容非标准的SQL数据库,不建议使用。

DEFAULT default_expr

DEFAULT子句为包含它的列定义赋予一个默认数据值。该值是任意不包含变量的表达式(不允许子查询和对当前表中其他列的交叉引用)。

默认值表达式的数据类型必须匹配列的数据类型。

默认值表达式将被用在任何没有指定列值的插入操作中。如果一列没有默认值,则默认值为空值。

GENERATED ALWAYS AS ( generation_expr) STORED

该子句创建一个生成列。 此列不能写入,只能在读取时返回所指定的表达式的值。

关键字STORED是必须的,用来表明该列将在写入时计算(计算出的值将会传递给外部数据封装器负责保存,并在读取时返回)。

生成表达式可以引用表中的其他列,但不能引用其他的生成列。 所使用的函数和操作符必须是不可变的,不能引用其他表。

server_name

用于该外部表的一个现有外部服务器的名称。

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

需要与新外部表或者它的一个列相关联的选项。被允许的选项名称和值是与每一个外部数据包装器相关的,并且它们会被该外部数据包装器的验证器函数验证。不允许重复的选项名称(不过一个表选项和一个列选项重名是可以的)。

示例

创建外部表films,并通过服务器film_server访问该表。

CREATE FOREIGN TABLE foreign_table (
        id integer NOT NULL,
        data text
)SERVER foreign_server
OPTIONS (schema_name 'some_schema', table_name 'some_table');

后续您可以像使用普通表一样使用该外部表进行查询以及管理。