Postgresql 中文操作指南

ALTER FOREIGN TABLE

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

Description

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 权限。

Parameters

  • name

    • 要进行更改,现有外键表(可能是经过模式限定的)的名称。如果在表名前面指定了 ONLY ,则只能更改该表。如果没有指定 ONLY ,则更改该表和所有其子表(如果存在)。作为可选项,可以在表名后指定 * ,以明确指出包括子表。

  • column_name

    • 新列或现有列的名称。

  • new_column_name

    • 现有列的新名称。

  • new_name

    • 表的名称。

  • data_type

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

  • table_constraint

    • 外键表的新表约束。

  • constraint_name

    • 要放弃的现有约束的名称。

  • CASCADE

    • 自动删除依赖于已删除列或约束的对象(例如,引用该列的视图),继而删除依赖于这些对象的所有对象(请参阅 Section 5.14 )。

  • RESTRICT

    • 如果存在任何依赖对象,则拒绝删除列或约束。这是默认行为。

  • trigger_name

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

  • ALL

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

  • USER

    • 除了内部生成的触发器外,禁用或启动属于外部表的触发器。

  • parent_table

    • 可与该外部表关联或解除关联的父表。

  • new_owner

    • 新表所有者的用户名。

  • new_schema

    • 表将被移至的模式的名称。

Notes

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

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

参考 CREATE FOREIGN TABLE 以详细了解有效参数。

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

Compatibility

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

ALTER FOREIGN TABLE DROP COLUMN 可用于删除外部表的唯一列,留下一个零列表。这是违反禁止零列外部表的 SQL 的一项扩展。