9.3 9.4 9.5 9.6 10 11 12 13
阿里云PostgreSQL 问题报告 纠错本页面

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

其中 action 是以下之一:

    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 }
    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 WITH OIDS
    SET WITHOUT OIDS
    INHERIT parent_table
    NO INHERIT parent_table
    OWNER TO { new_owner | 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 WITH OIDS

这种形式为表增加一个oid系统列 (见第 5.4 节)。如果该表已经有 OID, 则这种形式不会做任何事情。除非该表的外部数据封装器支持 OID, 否则这个列将被简单地读作零。

注意这和ADD COLUMN oid oid并不等效, 后者将增加一个名字刚好为oid的普通列而不是一个系统列。

SET WITHOUT OIDS

这种形式从表中移除oid系统列。 这正好等效于DROP COLUMN oid RESTRICT, 不过如果表上已经没有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权限。 要更改所有者,你还必须是新拥有角色的一个直接或者间接成员, 并且该角色必须具有在该表的模式上的CREATE权限 (这些限制强制修改拥有者不能通过丢弃并重建该排序规则来做任何不能做的事情。 不过,一个超级用户可以更改任意表的所有权)。要增加一列或者修改一个列的类型, 你还必须在该数据类型上拥有USAGE权限。

参数

name

一个要修改的现有外部表的名称(可以被模式限定)。 如果在表名前指定了ONLY,则只有该表被修改。 如果没有指定ONLY,则该表和它的所有后代表(如果有) 都会被修改。可选地,在表名后面指定* 可以显式地表示将后代表包括在内。

column_name

一个新的或者现有列的名称。

new_column_name

一个现有列的新名称。

new_name

该表的新名称。

data_type

新列的数据类型或者一个现有列的新数据类型。

table_constraint

外部表的新表约束。

constraint_name

要删除的现有约束的名称。

CASCADE

自动删除依赖于被删除列或约束的对象(例如,引用该列的视图)。

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 'value3');

兼容性

形式ADDDROP以及 SET DATA TYPE符合 SQL 标准。其他形式是 SQL 标准的 PostgreSQL扩展。在一个 ALTER FOREIGN TABLE命令中指定多于一个操作也是一种扩展。

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

又见

CREATE FOREIGN TABLE, DROP FOREIGN TABLE
<
/BODY >