PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

ALTER FOREIGN TABLE

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

Synopsis

ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
    action [, ... ]
ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] 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

where action is one of:

    ADD [ COLUMN ] [ IF NOT EXISTS ] 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 [ COLLATE collation ]
    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 SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
    ALTER [ COLUMN ] column_name OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ])
    ADD table_constraint [ NOT VALID ]
    VALIDATE CONSTRAINT constraint_name
    DROP CONSTRAINT [ IF EXISTS ]  constraint_name [ RESTRICT | CASCADE ]
    DISABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE REPLICA TRIGGER trigger_name
    ENABLE ALWAYS TRIGGER trigger_name
    SET WITHOUT OIDS
    INHERIT parent_table
    NO INHERIT parent_table
    OWNER 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 不允许零列的外部表。

另请参阅

CREATE FOREIGN TABLE, DROP FOREIGN TABLE