Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

ALTER TYPE

ALTER TYPE — 更改类型的定义

概要

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 ]

说明

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 中设置的基本类型属性子集。具体来说,可以修改这些属性

  • RECEIVE 可以设置为二进制输入函数的名称,或 NONE 以删除该类型的二进制输入函数。使用此选项需要超级用户权限。

  • SEND 可以设置为二进制输出函数的名称,或 NONE 以删除该类型的二进制输出函数。使用此选项需要超级用户权限。

  • TYPMOD_IN 可以设置为类型修正器输入函数的名称,或 NONE 以删除该类型的类型修正器输入函数。使用此选项需要超级用户权限。

  • TYPMOD_OUT 可以设置为类型修正器输出函数的名称,或 NONE 以删除该类型的类型修正器输出函数。使用此选项需要超级用户权限。

  • ANALYZE 可以设置为特定于类型的统计信息收集函数的名称,或 NONE 以删除该类型的统计信息收集函数。使用此选项需要超级用户权限。

  • SUBSCRIPT 可以设置为特定类型的脚标处理函数名称,或者设置为 NONE 来移除类型脚标处理函数。使用该选项需要超级用户权限。

  • STORAGE 可以设置为 plainextendedexternalmain(有关这些含义的更多信息,请参见 第 65.2 节)。但是,从 plain 更改到其他设置需要超级用户权限(因为它要求类型 C 函数全部为 TOAST 就绪),而且完全不允许从其他设置更改为 plain(因为该类型可能已经在数据库中存在 TOAST 值)。注意,更改该选项本身并不会更改任何存储的数据,它只是设置将来创建的表列要使用的默认 TOAST 策略。请参见 ALTER TABLE 以更改现有的表列的 TOAST 策略。

有关这些类型属性的更多详细信息,请参见 CREATE TYPE。注意,在适当的情况下,基于该类型的域会自动传播基本类型的这些属性更改。

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

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

参数

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

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

注释

如果 ALTER TYPE ... ADD VALUE(用于向枚举类型添加新值的格式)在事务块中执行,则在事务提交后才能使用新值。

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

示例

重命名数据类型

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

兼容性

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

另请参见

CREATE TYPEDROP TYPE