Postgresql 中文操作指南

ALTER TYPE

ALTER TYPE — 更改类型的定义

Synopsis

ALTER TYPE name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER TYPE name RENAME TO new_name
ALTER TYPE name SET SCHEMA new_schema
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
ALTER TYPE name action [, ... ]
ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ]
ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
ALTER TYPE name SET ( property = value [, ... ] )

where action is one of:

    ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
    DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ]
    ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]

Description

ALTER TYPE 更改现有类型的定义。有几个子形式:

  • OWNER

    • 这种形式更改类型的拥有者。

  • RENAME

    • 这种形式更改类型的名称。

  • SET SCHEMA

    • 这种形式将类型移动到另一个架构中。

  • RENAME ATTRIBUTE

    • 此表单仅能与复合类型一起使用。它会更改该类型的单个属性的名称。

  • ADD ATTRIBUTE

    • 此表单使用与 CREATE TYPE 相同的语法向复合类型添加新的属性。

  • DROP ATTRIBUTE [ IF EXISTS ]

    • 此表单从复合类型中删除一个属性。如果指定了 IF EXISTS 并且该属性不存在,则不会引发错误。这种情况下将改为发出通知。

  • ALTER ATTRIBUTE …​ SET DATA TYPE

    • 此表单更改复合类型的属性类型。

  • ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]

    • 此表单向枚举类型添加一个新值。可以在枚举的顺序中将新值的放置位置指定为 BEFOREAFTER 一个现有值。否则,会在值列表的末尾添加新项。

    • 如果指定 IF NOT EXISTS ,则如果该类型已经包含新值也不是错误:将发出通知但不会执行任何其他操作。否则,如果新值已存在,将出现错误。

  • RENAME VALUE

    • 此表单对枚举类型的一个值重命名。不影响值在枚举的顺序中的位置。如果指定的值不存在或新的名称已存在,将出现错误。

  • SET ( _property = value [, …​ ] )_

    • 此表单仅适用于基本类型。它允许调整可以 CREATE TYPE 中设置的基本类型属性的子集。具体来说,可以更改以下属性:

    • 有关这些类型属性的更多详细信息,请参见 CREATE TYPE 。请注意,在适当的情况下,针对基本类型的这些属性的更改所做的任何调整,都将自动传播到以此类型为基础的域中。

ADD ATTRIBUTEDROP ATTRIBUTEALTER ATTRIBUTE 操作可以组合到一个列表中,从而平行应用多个更改。例如,可以添加多个属性和/或在单个命令中更改多个属性的类型。

必须拥有才能使用 ALTER TYPE 类型。要更改类型的模式,还必须在新模式中拥有 CREATE 权限。要更改所有者,必须能够 SET ROLE 新所有者角色,并且该角色必须在新模式中具有 CREATE 权限。(这些限制强制要求更改所有者不会执行无法通过删除并重新创建类型来执行的操作。但是,超级用户可以随意更改任何类型的权限。)要添加属性或更改属性类型,还必须在新模式中具有 USAGE 权限。

Parameters

  • name

    • 要更改的现有类型的名称(可能对模式进行了限定)。

  • new_name

    • 该类型的新的名称。

  • new_owner

    • 该类型新所有者的用户名。

  • new_schema

    • 该类型的新模式。

  • attribute_name

    • 要添加、更改或删除的属性名称。

  • new_attribute_name

    • 要重新命名的属性的新名称。

  • data_type

    • 要添加的属性的数据类型,或要更改的属性的新类型。

  • new_enum_value

    • 要添加到枚举类型值列表的新值,或要赋予现有值的新名称。与所有枚举文字一样,都需要加上引号。

  • neighbor_enum_value

    • 新值在枚举类型的排序顺序中应紧挨添加或紧挨后的现有枚举值。与所有枚举文字一样,都需要加上引号。

  • existing_enum_value

    • 应重新命名的现有枚举值。与所有枚举文字一样,都需要加上引号。

  • property

    • 要修改的基本类型属性的名称;有关可能的值,请参见上文。

  • CASCADE

    • 自动将操作传播到正在更改类型的类型表及其实例。

  • RESTRICT

    • 如果正在更改的类型是类型表的类型,则拒绝操作。这是默认值。

Notes

如果在事务块内执行 ALTER TYPE …​ ADD VALUE (为枚举类型添加新值的形式),那么在提交事务之前无法使用新值。

涉及添加的枚举值的比较有时会比仅涉及枚举类型原始成员的比较慢。通常只有在使用 BEFOREAFTER 将新值的排序位置设置为不位于列表末尾时才会发生这种情况。但是,即使新值添加到末尾,有时也会发生这种情况(如果自枚举类型最初创建以来,OID 计数器“环绕”)。这种减速通常微不足道;但是,如果很重要,可以通过删除和重新创建枚举类型或转储和恢复数据库来重新获得最佳性能。

Examples

重命名数据类型:

ALTER TYPE electronic_mail RENAME TO email;

将类型 email 的所有者更改为 joe

ALTER TYPE email OWNER TO joe;

将类型 email 的模式更改为 customers

ALTER TYPE email SET SCHEMA customers;

向复合类型添加新属性:

ALTER TYPE compfoo ADD ATTRIBUTE f3 int;

在特定排序位置向枚举类型添加新值:

ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';

重命名枚举值:

ALTER TYPE colors RENAME VALUE 'purple' TO 'mauve';

为现有基本类型创建二进制 I/O 函数:

CREATE FUNCTION mytypesend(mytype) RETURNS bytea ...;
CREATE FUNCTION mytyperecv(internal, oid, integer) RETURNS mytype ...;
ALTER TYPE mytype SET (
    SEND = mytypesend,
    RECEIVE = mytyperecv
);

Compatibility

添加和删除属性的变体是 SQL 标准的一部分;其他变体是 PostgreSQL 扩展。

See Also