CREATE FOREIGN TABLE — 定义一个新外部表
CREATE FOREIGN TABLE [ IF NOT EXISTS ]table_name( [ {column_namedata_type[ OPTIONS (option'value' [, ... ] ) ] [ COLLATEcollation] [column_constraint[ ... ] ] |table_constraint} [, ... ] ] ) [ INHERITS (parent_table[, ... ] ) ] SERVERserver_name[ OPTIONS (option'value' [, ... ] ) ] CREATE FOREIGN TABLE [ IF NOT EXISTS ]table_namePARTITION OFparent_table[ ( {column_name[ WITH OPTIONS ] [column_constraint[ ... ] ] |table_constraint} [, ... ] ) ] FOR VALUESpartition_bound_specSERVERserver_name[ OPTIONS (option'value' [, ... ] ) ] 其中column_constraint是: [ CONSTRAINTconstraint_name] { NOT NULL | NULL | CHECK (expression) [ NO INHERIT ] | DEFAULTdefault_expr} 且table_constraint是: [ CONSTRAINTconstraint_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支持的数据类型的更多信息,参见Chapter 8。
COLLATE collationCOLLATE子句为该列(必须是一种可排序数据类型)指定一个排序规则。如果未指定,则使用该列数据类型的默认排序规则。
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_exprDEFAULT子句为其所在列定义对应的列分配一个默认数据值。该值可以是任何不包含变量的表达式(不允许包含子查询或对当前表中其他列的交叉引用)。默认表达式的数据类型必须与列的数据类型匹配。
在任何未为该列指定值的插入操作中,将使用默认表达式。如果列没有默认值,则默认值为 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 定义的形式存在的表继承是非标准的。