ALTER FOREIGN TABLE — 更改一个外部表的定义
ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ]name[ * ]action[, ... ] ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ]name[ * ] RENAME [ COLUMN ]column_nameTOnew_column_nameALTER FOREIGN TABLE [ IF EXISTS ]nameRENAME TOnew_nameALTER FOREIGN TABLE [ IF EXISTS ]nameSET SCHEMAnew_schemawhereactionis one of: ADD [ COLUMN ] [ IF NOT EXISTS ]column_namedata_type[ COLLATEcollation] [column_constraint[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]column_name[ RESTRICT | CASCADE ] ALTER [ COLUMN ]column_name[ SET DATA ] TYPEdata_type[ COLLATEcollation] ALTER [ COLUMN ]column_nameSET DEFAULTexpressionALTER [ COLUMN ]column_nameDROP DEFAULT ALTER [ COLUMN ]column_name{ SET | DROP } NOT NULL ALTER [ COLUMN ]column_nameSET STATISTICSintegerALTER [ COLUMN ]column_nameSET (attribute_option=value[, ... ] ) ALTER [ COLUMN ]column_nameRESET (attribute_option[, ... ] ) ALTER [ COLUMN ]column_nameSET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ALTER [ COLUMN ]column_nameOPTIONS ( [ ADD | SET | DROP ]option['value'] [, ... ]) ADDtable_constraint[ NOT VALID ] VALIDATE CONSTRAINTconstraint_nameDROP CONSTRAINT [ IF EXISTS ]constraint_name[ RESTRICT | CASCADE ] DISABLE TRIGGER [trigger_name| ALL | USER ] ENABLE TRIGGER [trigger_name| ALL | USER ] ENABLE REPLICA TRIGGERtrigger_nameENABLE ALWAYS TRIGGERtrigger_nameSET WITHOUT OIDS INHERITparent_tableNO INHERITparent_tableOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } OPTIONS ( [ ADD | SET | DROP ]option['value'] [, ... ])
ALTER FOREIGN TABLE 更改一个现有外部表的定义。它有若干子形式:
ADD [ COLUMN ] [ IF NOT EXISTS ]
这种形式向外表中添加一个新列,使用的语法与 CREATE FOREIGN TABLE 相同。如果指定了 IF NOT EXISTS 并且已经存在同名的列,则不会抛出错误。与向普通表添加列的情况不同,底层存储不会发生任何事情:这个动作只是声明某些新列现在可以通过这个外部表访问。
DROP [ COLUMN ] [ IF EXISTS ] 这种形式从外部表中删除一个列。如果表之外的任何东西依赖于该列(例如视图),就需要指定 CASCADE。如果指定了 IF EXISTS 并且该列不存在,则不会抛出错误。在这种情况下会发出一个提示。
SET DATA TYPE这种形式更改外部表一个列的类型。同样,这对任何底层存储都没有影响:这个动作只是更改 PostgreSQL 认为该列所具有的类型。
SET/DROP DEFAULT 这些形式为一个列设置或移除默认值。默认值只在后续的 INSERT 或 UPDATE 命令中生效;它们不会导致表中已经存在的行发生改变。
SET/DROP NOT 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 这些形式配置属于该外部表的触发器的触发行为。更多细节请参见 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自动删除依赖于被删除列或约束的对象(例如引用该列的视图),并进而删除依赖于那些对象的所有对象(参见 Section 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 不允许零列的外部表。