↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 命令 / 外部数据

SQL COMMAND · 外部数据

ALTER FOREIGN TABLE

更改外部表的定义

change the definition of a foreign table

ALTER外部数据引入 9.1现存至 20 devel7 次语法变更

动词
ALTER
对象
FOREIGN TABLE
引入版本
9.1
状态
现存
语法变更次数
7
手册小节数
6

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 语法未变,正文有更新。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

ALTER FOREIGN TABLE IF EXISTS ONLY name * action ,
ALTER FOREIGN TABLE · 语法 2
ALTER FOREIGN TABLE IF EXISTS ONLY name * RENAME COLUMN column_name TO new_column_name
ALTER FOREIGN TABLE · 语法 3
ALTER FOREIGN TABLE IF EXISTS name RENAME TO new_name
ALTER FOREIGN TABLE · 语法 4
ALTER FOREIGN TABLE IF EXISTS name SET SCHEMA new_schema
action
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 [ 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
其中 action 是以下之一:

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'] [, ... ])

PostgreSQL 18 手册 · 查看完整参考页

描述

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

自动删除依赖于被删除列或约束的对象(例如引用该列的视图),以及所有进一步依赖于这些对象的对象(见第 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 不允许零列外部表。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 19← 18正文更新

    正文更新
  2. PostgreSQL 18← 17正文更新

    正文更新
  3. PostgreSQL 17← 16正文更新

    正文更新
  4. PostgreSQL 16← 15语法变化

    + ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }正文更新
  5. PostgreSQL 14← 13语法变化

    + ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]+ OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }正文更新
  6. PostgreSQL 12← 11语法变化

    − SET WITH OIDS− SET WITHOUT OIDS正文更新
  7. PostgreSQL 11← 10正文更新

    正文更新
  8. PostgreSQL 9.6← 9.5正文更新

    正文更新
  9. PostgreSQL 9.5← 9.4语法变化

    + ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] name [ * ]+ ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] name [ * ]+ ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ]+ ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }+ 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 ]+ SET WITH OIDS+ SET WITHOUT OIDS+ INHERIT parent_table+ NO INHERIT parent_table+ OWNER TO { new_owner | CURRENT_USER | SESSION_USER }正文更新
  10. PostgreSQL 9.4← 9.3语法变化

    + DISABLE TRIGGER [ trigger_name | ALL | USER ]+ ENABLE TRIGGER [ trigger_name | ALL | USER ]+ ENABLE REPLICA TRIGGER trigger_name+ ENABLE ALWAYS TRIGGER trigger_name正文更新
  11. PostgreSQL 9.3← 9.2语法变化

    + ADD [ COLUMN ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]+ ALTER [ COLUMN ] column_name SET DEFAULT expression+ ALTER [ COLUMN ] column_name DROP DEFAULT− ADD [ COLUMN ] column_name data_type [ NULL | NOT NULL ]正文更新
  12. PostgreSQL 9.2← 9.1语法变化

    + ALTER FOREIGN TABLE [ IF EXISTS ] name+ ALTER FOREIGN TABLE [ IF EXISTS ] name+ RENAME [ COLUMN ] column_name TO new_column_name+ ALTER FOREIGN TABLE [ IF EXISTS ] name+ ALTER FOREIGN TABLE [ IF EXISTS ] name+ ADD [ COLUMN ] column_name data_type [ NULL | NOT NULL ]+ DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]+ ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type+ 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'] [, ... ])− RENAME [ COLUMN ] column TO new_column− ADD [ COLUMN ] column type [ NULL | NOT NULL ]− DROP [ COLUMN ] [ IF EXISTS ] column [ RESTRICT | CASCADE ]− ALTER [ COLUMN ] column [ SET DATA ] TYPE type− ALTER [ COLUMN ] column { SET | DROP } NOT NULL正文更新
  13. PostgreSQL 9.1← 9.0新增此命令

同组命令

命令动词对象版本变动最近变更
FOREIGN DATA外部数据13 条↑
CREATE FOREIGN DATA WRAPPERCREATEFOREIGN DATA WRAPPER 192 次
定义一个新的外部数据包装器现存
ALTER FOREIGN DATA WRAPPERALTERFOREIGN DATA WRAPPER 195 次
更改外部数据包装器的定义现存
DROP FOREIGN DATA WRAPPERDROPFOREIGN DATA WRAPPER 101 次
移除一个外部数据包装器现存
IMPORT FOREIGN SCHEMAIMPORTFOREIGN SCHEMA —
从一个外部服务器导入表定义现存
CREATE FOREIGN TABLECREATEFOREIGN TABLE 187 次
定义一个新外部表现存
ALTER FOREIGN TABLEALTERFOREIGN TABLE 167 次
更改外部表的定义现存
DROP FOREIGN TABLEDROPFOREIGN TABLE —
移除一个外部表现存
CREATE SERVERCREATESERVER 102 次
定义一个新的外部服务器现存
ALTER SERVERALTERSERVER 144 次
更改外部服务器的定义现存
DROP SERVERDROPSERVER 103 次
移除一个外部服务器描述符现存
CREATE USER MAPPINGCREATEUSER MAPPING 143 次
定义用户到外部服务器的新映射现存
ALTER USER MAPPINGALTERUSER MAPPING 143 次
更改用户映射的定义现存
DROP USER MAPPINGDROPUSER MAPPING 142 次
删除外部服务器的用户映射现存