ALTER FOREIGN TABLE — 更改外部表的定义
ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ]name
[ * ]action
[, ... ] ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ]name
[ * ] RENAME [ COLUMN ]column_name
TOnew_column_name
ALTER FOREIGN TABLE [ IF EXISTS ]name
RENAME TOnew_name
ALTER FOREIGN TABLE [ IF EXISTS ]name
SET SCHEMAnew_schema
whereaction
is one of: ADD [ COLUMN ]column_name
data_type
[ COLLATEcollation
] [column_constraint
[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]column_name
[ RESTRICT | CASCADE ] ALTER [ COLUMN ]column_name
[ SET DATA ] TYPEdata_type
[ COLLATEcollation
] ALTER [ COLUMN ]column_name
SET DEFAULTexpression
ALTER [ COLUMN ]column_name
DROP DEFAULT ALTER [ COLUMN ]column_name
{ SET | DROP } NOT NULL ALTER [ COLUMN ]column_name
SET STATISTICSinteger
ALTER [ COLUMN ]column_name
SET (attribute_option
=value
[, ... ] ) ALTER [ COLUMN ]column_name
RESET (attribute_option
[, ... ] ) ALTER [ COLUMN ]column_name
SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ALTER [ COLUMN ]column_name
OPTIONS ( [ ADD | SET | DROP ]option
['value
'] [, ... ]) ADDtable_constraint
[ NOT VALID ] VALIDATE CONSTRAINTconstraint_name
DROP CONSTRAINT [ IF EXISTS ]constraint_name
[ RESTRICT | CASCADE ] DISABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE REPLICA TRIGGERtrigger_name
ENABLE ALWAYS TRIGGERtrigger_name
SET WITHOUT OIDS INHERITparent_table
NO INHERITparent_table
OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } OPTIONS ( [ ADD | SET | DROP ]option
['value
'] [, ... ])
ALTER FOREIGN TABLE
更改现有外部表的定义。有几种子形式。
ADD COLUMN
此形式向外部表添加一个新列,语法与 CREATE FOREIGN TABLE
相同。与向常规表添加列不同,此操作不会影响底层存储:此操作只是声明有一个新列现在可以通过外部表访问。
DROP COLUMN [ IF EXISTS ]
此形式从外部表中删除一个列。如果外部表的其他对象依赖于该列(例如视图),则需要指定 CASCADE
。如果指定了 IF EXISTS
并且列不存在,则不会引发错误。在这种情况下,会发出通知。
SET DATA TYPE
此形式更改外部表列的数据类型。同样,这不会影响任何底层存储:此操作只是更改 PostgreSQL 认为该列具有的数据类型。
SET
/DROP DEFAULT
这些形式设置或删除列的默认值。默认值仅适用于后续的 INSERT
或 UPDATE
命令;它们不会导致表中已有的行发生更改。
SET
/DROP NOT NULL
标记一个列允许或不允许 NULL
值。
SET STATISTICS
此形式为后续的 ANALYZE
操作设置每个列的统计信息收集目标。有关更多详细信息,请参阅 ALTER TABLE
的类似形式。
SET ( attribute_option
= value
[, ... ] )
RESET ( attribute_option
[, ... ] )
此形式设置或重置每个属性的选项。有关更多详细信息,请参阅 ALTER TABLE
的类似形式。
SET STORAGE
此形式设置列的存储模式。有关更多详细信息,请参阅 ALTER TABLE
的类似形式。请注意,存储模式不会产生任何影响,除非表的外部数据包装器选择关注它。
ADD table_constraint
[ NOT VALID ]
此形式向外部表添加一个新约束,语法与 CREATE FOREIGN TABLE
相同。目前只支持 CHECK
和 NOT NULL
约束。
与向常规表添加约束不同,此操作不会验证约束是否正确;相反,此操作只是声明应该假设外部表中的所有行都满足某个新条件。(请参阅 CREATE FOREIGN TABLE
中的讨论。)如果约束被标记为 NOT VALID
(仅适用于 CHECK
情况),则不假设它成立,而仅记录下来以备将来使用。
VALIDATE CONSTRAINT
此形式将之前被标记为 NOT VALID
的约束标记为有效。不会采取任何行动来验证约束,但将来的查询将假定它成立。
DROP CONSTRAINT [ IF EXISTS ]
此形式删除外部表上的指定约束。如果指定了 IF EXISTS
并且约束不存在,则不会引发错误。在这种情况下,会发出通知。
DISABLE
/ENABLE [ REPLICA | ALWAYS ] TRIGGER
这些形式配置外部表所属触发器(trigger)的触发。有关更多详细信息,请参阅 ALTER TABLE
的类似形式。
SET WITHOUT OIDS
用于删除 oid
系统列的兼容性语法。由于 oid
系统列已无法添加,此操作永远不会产生任何效果。
INHERIT parent_table
此形式将目标外部表添加为指定父表的新子表。有关更多详细信息,请参阅 ALTER TABLE
的类似形式。
NO INHERIT parent_table
此形式将目标外部表从指定父表的子表列表中移除。
OWNER
此形式将外部表的所有者更改为指定用户。
OPTIONS ( [ ADD | SET | DROP ] option
['value
'] [, ... ] )
更改外部表或其某个列的选项。ADD
、SET
和 DROP
指定要执行的操作。如果没有显式指定操作,则假定为 ADD
。不允许重复的选项名称(尽管表选项和列选项具有相同的名称是允许的)。选项名称和值也会使用外部数据包装器库进行验证。
RENAME
RENAME
形式更改外部表的名称或外部表中单个列的名称。
SET SCHEMA
此形式将外部表移动到另一个模式。
除 RENAME
和 SET SCHEMA
外,所有操作都可以组合成一个多重修改列表,以并行应用。例如,可以在单个命令中添加多个列和/或更改多个列的类型。
如果命令写为 ALTER FOREIGN TABLE IF EXISTS ...
并且外部表不存在,则不会引发错误。在这种情况下会发出通知。
要使用 ALTER FOREIGN TABLE
,您必须拥有该表。要更改外部表的模式,您还必须对新模式具有 CREATE
权限。要更改所有者,您必须能够 SET ROLE
到新的所有者角色,并且该角色必须对表的模式具有 CREATE
权限。(这些限制确保更改所有者不会执行您通过删除和重新创建表而无法完成的操作。但是,超级用户可以更改任何表的归属。)要添加列或更改列类型,您还必须对数据类型具有 USAGE
权限。
name
要更改的现有外部表的名称(可选择性地带模式限定)。如果表名称前指定了 ONLY
,则只更改该表。如果未指定 ONLY
,则更改该表及其所有子表(如果存在)。可选地,可以在表名称后指定 *
以明确表示包含子表。
column_name
新列或现有列的名称。
new_column_name
现有列的新名称。
new_name
表的新名称。
data_type
新列的数据类型,或现有列的新数据类型。
table_constraint
外部表的新表约束。
constraint_name
要删除的现有约束的名称。
CASCADE
自动删除依赖于被删除列或约束的对象(例如,引用该列的视图),以及依赖于这些对象的对象(参见 第 5.15 节)。
RESTRICT
如果存在任何依赖对象,则拒绝删除列或约束。这是默认行为。
trigger_name
要禁用或启用的单个触发器的名称。
ALL
禁用或启用外部表所属的所有触发器。(如果任何触发器是内部生成的触发器,则需要超级用户权限。核心系统不会向外部表添加此类触发器,但附加代码可能会这样做。)
USER
禁用或启用外部表所属的所有触发器,但内部生成的触发器除外。
parent_table
要与此外部表关联或取消关联的父表。
new_owner
新表所有者的用户名。
new_schema
将表移动到的模式的名称。
关键字 COLUMN
是多余的,可以省略。
在使用 ADD COLUMN
或 DROP COLUMN
添加或删除列、添加 NOT NULL
或 CHECK
约束,或者使用 SET DATA TYPE
更改列类型时,不会检查与外部服务器的一致性。用户有责任确保表定义与远程端匹配。
有关有效参数的进一步说明,请参阅 CREATE FOREIGN TABLE
。
将列标记为非空
ALTER FOREIGN TABLE distributors ALTER COLUMN street SET NOT NULL;
更改外部表的选项
ALTER FOREIGN TABLE myschema.distributors OPTIONS (ADD opt1 'value', SET opt2 'value2', DROP opt3);
ADD
、DROP
和 SET DATA TYPE
形式符合 SQL 标准。其他形式是 PostgreSQL 对 SQL 标准的扩展。此外,在一个 ALTER FOREIGN TABLE
命令中指定多个操作的能力也是一种扩展。
ALTER FOREIGN TABLE DROP COLUMN
可用于删除外部表的唯一列,从而留下一个零列的表。这是 SQL 的一个扩展,SQL 不允许零列的外部表。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。