ALTER FOREIGN TABLE

Name

ALTER FOREIGN TABLE -- 更改一个外部表的定义

Synopsis

ALTER FOREIGN TABLE [ IF EXISTS ] name
    action [, ... ]
ALTER FOREIGN TABLE [ IF EXISTS ] name
    RENAME [ COLUMN ] column_name TO new_column_name
ALTER FOREIGN TABLE [ IF EXISTS ] name
    RENAME TO new_name
ALTER FOREIGN TABLE [ IF EXISTS ] name
    SET SCHEMA new_schema

其中 action 是以下之一:

    ADD [ COLUMN ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
    DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
    ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type
    ALTER [ COLUMN ] column_name SET DEFAULT expression
    ALTER [ COLUMN ] column_name DROP DEFAULT
    ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
    ALTER [ COLUMN ] column_name SET STATISTICS integer
    ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )
    ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )
    ALTER [ COLUMN ] column_name OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ])
    DISABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE REPLICA TRIGGER trigger_name
    ENABLE ALWAYS TRIGGER trigger_name
    OWNER TO new_owner
    OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ])

描述

ALTER FOREIGN TABLE更改一个现有外部表的定义。 有几种子形式:

ADD COLUMN

这种形式使用与CREATE FOREIGN TABLE相同的语法把 一个新的列增加到该外部表。和为常规表增加一列不同,这种形式并不影响底层 的存储:这个动作只是简单地声明通过该外部表可以访问某个新的列而已。

DROP COLUMN [ IF EXISTS ]

这种形式从一个外部表删掉一列。如果在该表外部有任何东西依赖于该列, 你将需要写上CASCADE,典型的例子就是视图。如果指定了 IF EXISTS并且该列不存在,将不会抛出错误。在这种 情况下会转而发出一个提示。

IF EXISTS

如果该外部表不存在则不抛出一个错误。这种情况下会发出一个提示。

SET DATA TYPE

这种形式更改一个外部表的一列的类型。

SET/DROP DEFAULT

这些形式设置或者移除一列的默认值。默认值只会应用于后续的 INSERTUPDATE命令,它们 不会导致已经在表中的行被更改。

SET/DROP NOT NULL

把一列标记为允许或者不允许空值。

SET STATISTICS

这种形式为后续的ANALYZE操作设置针对每列 的统计收集目标。详见ALTER TABLE的类似形式。

SET ( attribute_option = value [, ... ] )
RESET ( attribute_option [, ... ] )

这种形式设置或重置针对每个属性的选项。详见ALTER TABLE 的类似形式。

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

这些形式配置属于该外部表的触发器的触发情况。详见 ALTER TABLE的类似形式。

OWNER

这种形式把该外部表的拥有者改成指定的用户。

RENAME

RENAME形式更改一个外部表的名称或者其中一个 列的名称。

SET SCHEMA

这种形式把该外部表移动到另一个模式。

OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] )

更改该外部表或者其中一个列的选项。ADDSET 以及DROP指定要执行的动作。如果没有显式地指定操作,将假定 为ADD。不允许重复的名称(不过一个表选项和一个列选项可以重 名)。选项名称和值也会用外部数据包装器库来验证。

所有除了RENAMESET SCHEMA的 动作都能被整合到一个多修改列表以便能被并行应用。例如,可以在一个 命令中增加几个列并且/或者修改几个列的类型。

你必须拥有该表以使用ALTER FOREIGN TABLE。要更改一个 外部表的模式,你必须还拥有新模式上的CREATE特权。要 更改拥有者,你还必须是新拥有角色的一个直接或者间接成员,并且该角色必须 具有在该表的模式上的CREATE特权(这些限制强制修改拥有 者不能做一些通过删除和重建该表做不到的事情。不过,一个超级用户怎么都能 更改任何表的所有权)。要增加一列或者修改一个列的类型,你还必须具有该数 据类型上的USAGE特权。

参数

name

一个要修改的现有外部表的名称(可以被模式限定)。

column_name

一个新的或者现有列的名称。

new_column_name

一个现有列的新名称。

new_name

该表的新名称。

data_type

新列的数据类型或者一个现有列的新数据类型。

CASCADE

自动删除依赖于被删除列的对象(例如,引用该列的视图)。

RESTRICT

如果有任何依赖对象就拒绝删除该列。这是默认行为。

trigger_name

要禁用或启用的一个触发器的名称。

ALL

禁用或者启用所有属于该外部表的触发器(如果任何触发器是内部生成 的触发器,这都要求超级用户特权。核心系统不会向外部表增加这类触发 器,但是附加代码会这样做。)。

USER

禁用或者启用属于该外部表的除了内部生成的触发器之外的所有触发器。

new_owner

该表的新拥有者的用户名。

new_schema

该表要被移动到其中的模式的名称。

注解

关键词COLUMN是噪声词并且可以被忽略。

当使用ADD COLUMNDROP COLUMN增加或移除一列、增加一个NOT NULL 约束或者用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');

兼容性

形式ADDDROP以及 SET DATA TYPE符合 SQL 标准。其他形式是 SQL 标准的 PostgreSQL扩展。在一个 ALTER FOREIGN TABLE命令中指定多于一个操作也是一种扩展。

ALTER FOREIGN TABLE DROP COLUMN可以被用来删除 一个外部表的唯一一列,从而留下一个没有列的表。这是一种 SQL 的扩展,它 允许没有列的外部表。