SQL COMMAND · 外部数据
ALTER FOREIGN TABLE
更改外部表的定义
ALTER外部数据引入 10(基线)现存至 20 devel2 次语法变更
- 动词
ALTER- 对象
FOREIGN TABLE- 分组
- 外部数据
- 引入版本
- 10(基线)
- 状态
- 现存
- 语法变更次数
- 2
- 手册小节数
- 6
版本轨迹
相对 PostgreSQL 17 无变化。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
ALTER FOREIGN TABLE · 语法 2
ALTER FOREIGN TABLE · 语法 3
ALTER FOREIGN TABLE · 语法 4
action
语法概要
ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ]name[ * ]action[, ... ] ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ]name[ * ] RENAME [ COLUMN ]column_nameTOnew_column_nameALTER FOREIGN TABLE [ IF EXISTS ]nameRENAME TOnew_nameALTER FOREIGN TABLE [ IF EXISTS ]nameSET SCHEMAnew_schema其中action是以下之一: ADD [ COLUMN ] [ IF NOT EXISTS ]column_namedata_type[ COLLATEcollation] [column_constraint[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]column_name[ RESTRICT | CASCADE ] ALTER [ COLUMN ]column_name[ SET DATA ] TYPEdata_type[ COLLATEcollation] ALTER [ COLUMN ]column_nameSET DEFAULTexpressionALTER [ COLUMN ]column_nameDROP DEFAULT ALTER [ COLUMN ]column_name{ SET | DROP } NOT NULL ALTER [ COLUMN ]column_nameSET STATISTICSintegerALTER [ COLUMN ]column_nameSET (attribute_option=value[, ... ] ) ALTER [ COLUMN ]column_nameRESET (attribute_option[, ... ] ) ALTER [ COLUMN ]column_nameSET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ALTER [ COLUMN ]column_nameOPTIONS ( [ ADD | SET | DROP ]option['value'] [, ... ]) ADDtable_constraint[ NOT VALID ] VALIDATE CONSTRAINTconstraint_nameDROP CONSTRAINT [ IF EXISTS ]constraint_name[ RESTRICT | CASCADE ] DISABLE TRIGGER [trigger_name| ALL | USER ] ENABLE TRIGGER [trigger_name| ALL | USER ] ENABLE REPLICA TRIGGERtrigger_nameENABLE ALWAYS TRIGGERtrigger_nameSET WITHOUT OIDS INHERITparent_tableNO INHERITparent_tableOWNER 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的类似形式。 注意,除非该表的外部数据包装器选择理会该设置,否则存储模式不会产生效果。ADDtable_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系统列,因此它实际上永远不会产生任何效果。INHERITparent_table该形式把目标外部表添加为指定父表的一个新子表。 详见
ALTER TABLE的类似形式。NO INHERITparent_table该形式把目标外部表从指定父表的子表列表中移除。
OWNER该形式把外部表的拥有者更改为指定用户。
OPTIONS ( [ ADD | SET | DROP ]option['value'] [, ... ] )更改外部表或其某一列的选项。
ADD、SET和DROP指定要执行的动作。如果没有显式指定操作,则默认是ADD。不允许重复的选项名(不过表选项和列选项同名是可以的)。 选项名和值也会通过外部数据包装器库进行验证。RENAMERENAME形式更改外部表的名称,或者更改其中某一列的名称。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 不允许零列外部表。
另见
语法演化
相邻大版本之间的差异,新的在前。版本号链接到对应快照。
PostgreSQL 20← 19正文更新
正文更新PostgreSQL 19← 18正文更新
正文更新PostgreSQL 14← 13语法变化
+ 其中 action 是以下之一:+ ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]+ ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }+ OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }− 其中action为以下之一:− ADD [ COLUMN ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]− ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }− OWNER TO { new_owner | CURRENT_USER | SESSION_USER }正文更新PostgreSQL 12← 11语法变化
− SET WITH OIDS正文更新PostgreSQL 11← 10正文更新
正文更新
同组命令
| 命令 | 动词 | 对象 | 版本变动 | 最近变更 |
|---|---|---|---|---|
CREATE FOREIGN DATA WRAPPER | CREATE | FOREIGN DATA WRAPPER | 191 次 | |
| 定义一个新的外部数据包装器 | 现存 | |||
ALTER FOREIGN DATA WRAPPER | ALTER | FOREIGN DATA WRAPPER | 192 次 | |
| 更改外部数据包装器的定义 | 现存 | |||
DROP FOREIGN DATA WRAPPER | DROP | FOREIGN DATA WRAPPER | — | |
| 移除一个外部数据包装器 | 现存 | |||
IMPORT FOREIGN SCHEMA | IMPORT | FOREIGN SCHEMA | — | |
| 从一个外部服务器导入表定义 | 现存 | |||
CREATE FOREIGN TABLE | CREATE | FOREIGN TABLE | 143 次 | |
| 定义一个新外部表 | 现存 | |||
ALTER FOREIGN TABLE | ALTER | FOREIGN TABLE | 142 次 | |
| 更改外部表的定义 | 现存 | |||
DROP FOREIGN TABLE | DROP | FOREIGN TABLE | — | |
| 移除一个外部表 | 现存 | |||
CREATE SERVER | CREATE | SERVER | 111 次 | |
| 定义一个新的外部服务器 | 现存 | |||
ALTER SERVER | ALTER | SERVER | 141 次 | |
| 更改外部服务器的定义 | 现存 | |||
DROP SERVER | DROP | SERVER | — | |
| 移除一个外部服务器描述符 | 现存 | |||
CREATE USER MAPPING | CREATE | USER MAPPING | 142 次 | |
| 定义用户到外部服务器的新映射 | 现存 | |||
ALTER USER MAPPING | ALTER | USER MAPPING | 141 次 | |
| 更改用户映射的定义 | 现存 | |||
DROP USER MAPPING | DROP | USER MAPPING | 141 次 | |
| 删除外部服务器的用户映射 | 现存 | |||