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_schema其中action是以下之一: ADD [ COLUMN ]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 } 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 WITH OIDS SET WITHOUT OIDS INHERITparent_tableNO INHERITparent_tableOWNER TO {new_owner| 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把一列标记为允许或者不允许空值。
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约束。
     
      和向常规表增加约束的情况不同,为外部表增加约束时不会做任何事情来
      验证该约束是否正确。这个动作只是简单地声明了该外部表中所有的行都
      应该满足的某种新的条件(见
      CREATE FOREIGN TABLE中的讨论)。如果该
      约束被标记为NOT VALID,那么它不被假设为有效,而只是
      被记录下来以备未来使用。
     
VALIDATE CONSTRAINT
      这种形式把一个之前被标记为NOT VALID的约束标
      记为有效。不会做任何动作来验证该约束,但是未来的查询将会假定该
      约束是保持的。
     
DROP CONSTRAINT [ IF EXISTS ]
      这种形式删掉在一个外部表上的指定约束。如果指定了
      IF EXISTS但约束并不存在,则不会抛出错误。
      在这种情况下会发出一个提示。
     
DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER这些形式配置属于该外部表的触发器的触发情况。详见 ALTER TABLE的类似形式。
SET WITH OIDS
      这种形式为表增加一个oid系统列(见
      Section 5.4)。如果该表已经有 OID,则
      这种形式不会做任何事情。除非该表的外部数据包装器支持 OID,这个列
      将被简单地读作零。
     
      注意这和ADD COLUMN oid oid并不等效,后者将增加
      一个刚好名字为oid的普通列而不是一个系统列。
     
SET WITHOUT OIDS
      这种形式从表移除oid系统列。这正好
      等效于DROP COLUMN oid RESTRICT,
      不过如果表上已经没有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特权。要
   更改拥有者,你还必须是新拥有角色的一个直接或者间接成员,并且该角色必须
   具有在该表的模式上的CREATE特权(这些限制强制修改拥有
   者不能做一些通过删除和重建该表做不到的事情。不过,一个超级用户怎么都能
   更改任何表的所有权)。要增加一列或者修改一个列的类型,你还必须具有该数
   据类型上的USAGE特权。
  
name
        一个要修改的现有外部表的名称(可以被模式限定)。如果在表名前指定了
        ONLY,则只有该表被修改。如果没有指定ONLY,
        该表和它所有的后代表(如果有)都会被修改。可选地,在表名后面指定
        *可以显式地表示将后代表包括在内。
       
column_name一个新的或者现有列的名称。
new_column_name一个现有列的新名称。
new_name该表的新名称。
data_type新列的数据类型或者一个现有列的新数据类型。
table_constraint外部表的新的表约束。
constraint_name要删除的现有约束的名称。
CASCADE自动删除依赖于被删除列或约束的对象(例如,引用该列的视图), 并且接着删除依赖于那些对象的 所有对象(见Section 5.13)。
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 'value3');
   形式ADD、DROP以及
   SET DATA TYPE符合 SQL 标准。其他形式是 SQL 标准的
   PostgreSQL扩展。在一个
   ALTER FOREIGN TABLE命令中指定多于一个操作也是一种扩展。
  
   ALTER FOREIGN TABLE DROP COLUMN可以被用来删除
   一个外部表的唯一一列,从而留下一个没有列的表。这是一种 SQL 的扩展,它
   允许没有列的外部表。