更改外表

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

Synopsis

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

Description

ALTER FOREIGN TABLE更改现有外部表的定义。有几个子窗体:

  • ADD COLUMN

    • 此表单使用与创建外表相同的语法向外部表添加新列。与将列添加到常规表的情况不同,底层存储没有任何反应:此操作只是声明现在可以通过外部表访问某些新列。
  • 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 ]

    • 此表单使用与创建外表相同的语法向外部表添加新约束。当前仅支持CHECK个约束。

与将约束添加到常规表的情况不同,没有做任何事情来验证约束是正确的。相反,此操作只是声明应假定某些新条件适用于外表中的所有行。 (请参阅创建外表中的讨论。)如果约束标记为NOT VALID,则不假定该约束成立,而仅记录下来以备将来使用。

  • VALIDATE CONSTRAINT

    • 此表单将先前标记为NOT VALID的约束标记为有效。不会采取任何措施来验证约束,但是以后的查询将假定该约束成立。
  • DROP CONSTRAINT [ IF EXISTS ]

    • 此表单将指定的约束放在外部表上。如果指定IF EXISTS且该约束不存在,则不会引发任何错误。在这种情况下,将发出通知。
  • DISABLE / ENABLE [ REPLICA | ALWAYS ] TRIGGER

    • 这些表格配置了属于外部表的触发器的触发。有关更多详细信息,请参见ALTER TABLE的类似形式。
  • SET WITH OIDS

    • 此表单将oid系统列添加到表中(请参见Section 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特权。

Parameters

  • name

    • 要更改的现有外部表的名称(可能是模式限定的)。如果在表名之前指定了ONLY,则仅更改该表。如果未指定ONLY,则该表及其所有后代表(如果有)将被更改。 (可选)可以在表名称后指定*,以明确指示包括后代表。
  • column_name

    • 新列或现有列的名称。
  • new_column_name

    • 现有列的新名称。
  • new_name

    • 表格的新名称。
  • data_type

    • 新列的数据类型,或现有列的新数据类型。
  • table_constraint

    • 外部表的新表约束。
  • constraint_name

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

    • 自动删除依赖于所删除的列或约束的对象(例如,引用该列的视图),并依次删除所有依赖于那些对象的对象(请参见Section 5.13)。
  • RESTRICT

    • 如果有任何相关对象,则拒绝删除列或约束。这是默认行为。
  • trigger_name

    • 要禁用或启用的单个触发器的名称。
  • ALL

    • 禁用或启用属于外部表的所有触发器。 (如果任何触发器是内部生成的触发器,则这需要超级用户特权.核心系统不会将此类触发器添加到外部表中,但是附加代码可以这样做.)
  • USER

    • 禁用或启用属于外部表的所有触发器(内部生成的触发器除外)。
  • parent_table

    • 父表要与此外部表关联或解除关联。
  • new_owner

    • 表的新所有者的用户名。
  • new_schema

    • 表将被移动到的模式的名称。

Notes

关键字COLUMN是噪音,可以省略。

当使用ADD COLUMNDROP COLUMN添加或删除列,添加NOT NULLCHECK约束或使用SET DATA TYPE更改列类型时,不检查与外部服务器的一致性。用户有责任确保表定义与远程端匹配。

有关有效参数的进一步说明,请参见创建外表

Examples

要将列标记为非空:

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

Compatibility

形式ADDDROPSET DATA TYPE符合 SQL 标准。其他形式是 SQL 标准的 PostgreSQL 扩展。同样,在单个ALTER FOREIGN TABLE命令中指定多个操纵的功能也是一种扩展。

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

See Also

创建外表, 下降外表