VastbaseE100

基于开源技术的HTAP数据库管理系统。性能优异,稳定可靠,提供诸多专属领域特性。

Menu

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 }

而 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

    该列的数据类型。可以包括数组指示符。更多 Vastbase E100支持的数据类型可见第 8 章。

  • COLLATE collation

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

  • INHERITS ( parent_table [, … ] )

    可选的INHERITS子句指定了一个表的列表,新的外部表 会自动从中继承所有列。父表可以是普通表或者外部表。详见 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子句为包含它的列定义赋予一个默认数据值。该 值是任意不包含变量的表达式(不允许子查询和对当前表中其他列的交叉 引用)。默认值表达式的数据类型必须匹配列的数据类型。 默认值表达式将被用在任何没有指定列值的插入操作中。如果一列没有 默认值,则默认值为空值。

  • server_name

    要用于该外部表的一个现有外部服务器的名称。有关定义一个服务器 的细节可以参考CREATE SERVER。

  • OPTIONS ( option 'value' [, …] )

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

注意事项

外部表的约束(例如 CHECK 或 NOT NULL 子句)不是由核心Vastbase E100系统强制执行的,并且大多数外部数据包装器也不会尝试强制执行它们。也就是说,简单地假设约束成立。这种强制执行没有什么意义,因为它只适用于通过外表插入或更新的行,而不适用于通过其他方式修改的行,例如直接在远程服务器上。相反,附加到外表的约束应表示远程服务器强制执行的约束。

一些特殊用途的外部数据包装器可能是它们访问的数据的唯一访问机制,在这种情况下,外部数据包装器本身可能适合执行约束实施。但你不应该假设包装器会这样做,除非它的文档说明了这一点。

虽然Vastbase E100不会尝试对外表执行约束,但它确实认为它们对于查询优化是正确的。如果外表中可见的行不满足声明的约束,则对表的查询可能会产生错误的答案。用户有责任确保约束定义与实际匹配。

示例

创建外部表 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;

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

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