2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本: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

将列标记为允许或不允许空值。

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 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 不允许零列外部表。

提交更正

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