ALTER TYPE

ALTER TYPE-更改类型的定义

Synopsis

ALTER TYPE name action [, ... ]
ALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
ALTER TYPE name RENAME TO new_name
ALTER TYPE name SET SCHEMA new_schema
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

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更改现有类型的定义。有几个子窗体:

  • ADD ATTRIBUTE

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

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

    • 此形式更改复合类型的属性的类型。
  • OWNER

    • 此表单更改类型的所有者。
  • RENAME

    • 此表单更改类型的名称或复合类型的单个属性的名称。
  • SET SCHEMA

    • 这种形式将类型移动到另一个模式。
  • ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]

    • 此表单为枚举类型添加了新值。可以将新值在枚举 Sequences 中的位置指定为现有值的BEFOREAFTER。否则,新项目将添加到值列表的末尾。

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

  • RENAME VALUE

    • 此表单重命名枚举类型的值。该值在枚举 Sequences 中的位置不受影响。如果指定的值不存在或新名称已存在,将发生错误。

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

您必须拥有类型才能使用ALTER TYPE。要更改类型的架构,您还必须对新架构具有CREATE特权。要更改所有者,您还必须是新拥有角色的直接或间接成员,并且该角色必须对类型的架构具有CREATE特权。 (这些限制规定,更改所有者不能通过删除并重新创建类型来完成您无法做的任何事情.但是,超级用户仍然可以更改任何类型的所有权.)要添加属性或更改属性类型,您必须在数据类型上也具有USAGE特权。

Parameters

  • name

    • 要更改的现有类型的名称(可能是模式限定的)。
  • new_name

    • 类型的新名称。
  • new_owner

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

    • 类型的新架构。
  • attribute_name

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

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

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

    • 要添加到枚举类型的值列表中的新值,或要给现有值赋予的新名称。像所有枚举 Literals 一样,也需要用引号引起来。
  • neighbor_enum_value

    • 应该在枚举类型的排序 Sequences 之前或之后立即添加新值的现有枚举值。像所有枚举 Literals 一样,也需要用引号引起来。
  • existing_enum_value

    • 应重命名的现有枚举值。像所有枚举 Literals 一样,也需要用引号引起来。
  • 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';

Compatibility

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

See Also

CREATE TYPE, DROP TYPE