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 | 一个可选的用于列或者表约束的名字。如果该约束被违背,则该约束名字会出现在错误消息中。约束名 |
NOT NULL | 该列不允许包含空值。 |
NULL | 该列可以包含空值,为默认值。 |
CHECK ( expression) [ NO INHERIT ] | CHECK子句指定一个产生布尔结果的表达式,该外部表中的每一行都应该满足该表达式。对于该外部表中所有的行, 这个表达式应该产生TRUE或UNKNOWN而不能产生FALSE。被作为列约束指定的检查约束应该只引用该列的值,而出现在表约束中的表达式可以引用多列。 CHECK表达式不能包含子查询,也不能引用除当前行的列之外的其他变量。可以引用系统列 被标记为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');
后续您可以像使用普通表一样使用该外部表进行查询以及管理。