2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

ALTER FOREIGN TABLE

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

概要

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 ] 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

此形式向外部表添加一个新列,语法与 CREATE FOREIGN TABLE 相同。与向常规表添加列不同,此操作不会影响底层存储:此操作只是声明有一个新列现在可以通过外部表访问。

DROP COLUMN [ IF EXISTS ]

此形式从外部表中删除一个列。如果外部表的其他对象依赖于该列(例如视图),则需要指定 CASCADE。如果指定了 IF EXISTS 并且列不存在,则不会引发错误。在这种情况下,会发出通知。

SET DATA TYPE

此形式更改外部表列的数据类型。同样,这不会影响任何底层存储:此操作只是更改 PostgreSQL 认为该列具有的数据类型。

SET/DROP DEFAULT

这些形式设置或删除列的默认值。默认值仅适用于后续的 INSERTUPDATE 命令;它们不会导致表中已有的行发生更改。

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 相同。目前只支持 CHECKNOT 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'] [, ... ] )

更改外部表或其某个列的选项。ADDSETDROP 指定要执行的操作。如果没有显式指定操作,则假定为 ADD。不允许重复的选项名称(尽管表选项和列选项具有相同的名称是允许的)。选项名称和值也会使用外部数据包装器库进行验证。

RENAME

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

SET SCHEMA

此形式将外部表移动到另一个模式。

RENAMESET 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 COLUMNDROP COLUMN 添加或删除列、添加 NOT NULLCHECK 约束,或者使用 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);

兼容性

ADDDROPSET DATA TYPE 形式符合 SQL 标准。其他形式是 PostgreSQL 对 SQL 标准的扩展。此外,在一个 ALTER FOREIGN TABLE 命令中指定多个操作的能力也是一种扩展。

ALTER FOREIGN TABLE DROP COLUMN 可用于删除外部表的唯一列,从而留下一个零列的表。这是 SQL 的一个扩展,SQL 不允许零列的外部表。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。