# ALTER TYPE

ALTER TYPE — change the definition of a 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 TYPEchanges the definition of an existing type. There are several subforms:

OWNER

This form changes the owner of the type.

RENAME

This form changes the name of the type.

SET SCHEMA

This form moves the type into another schema.

RENAME ATTRIBUTE

This form is only usable with composite types. It changes the name of an individual attribute of the type.

ADD ATTRIBUTE

This form adds a new attribute to a composite type, using the same syntax asCREATE TYPE.

DROP ATTRIBUTE [ IF EXISTS ]

This form drops an attribute from a composite type. IfIF EXISTSis specified and the attribute does not exist, no error is thrown. In this case a notice is issued instead.

ALTER ATTRIBUTE ... SET DATA TYPE

This form changes the type of an attribute of a composite type.

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

This form adds a new value to an enum type. The new value's place in the enum's ordering can be specified as beingBEFORE要么现有值之一。否则,新项目将添加到值列表的末尾。

如果如果不存在已指定,如果类型已包含新值则不是错误:发出通知但不采取其他操作。否则,如果新值已经存在,则会发生错误。

重命名值

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

放 ( *财产* = *价值* [, ... ] )

此表单仅适用于基本类型。它允许调整可以设置的基本类型属性的子集创建类型.具体来说,可以更改这些属性:

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

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

  • TYPMOD_IN可以设置为类型修饰符输入函数的名称,或者没有删除类型的类型修饰符输入函数。使用此选项需要超级用户权限。

  • TYPMOD_OUT可以设置为类型修饰符输出函数的名称,或者没有任何删除类型的类型修饰符输出函数。使用此选项需要超级用户权限。

  • 分析可以设置为特定类型的统计信息收集函数的名称,或者没有任何删除类型的统计信息收集功能。使用此选项需要超级用户权限。

  • 订阅可以设置为特定类型的下标处理函数的名称,或者没有任何删除类型的下标处理函数。使用此选项需要超级用户权限。

  • 贮存可以设置为清楚的,扩展的,外部的, 或者主要的(看第 70.2 节有关这些含义的更多信息)。然而,从改变清楚的到另一个设置需要超级用户权限(因为它要求类型的 C 函数都准备好 TOAST),并更改为清楚的根本不允许来自另一个设置(因为该类型可能已经在数据库中存在 TOASTed 值)。请注意,更改此选项本身不会更改任何存储的数据,它只是设置默认 TOAST 策略以用于将来创建的表列。看更改表更改现有表列的 TOAST 策略。

    创建类型有关这些类型属性的更多详细信息。请注意,在适当的情况下,基类型的这些属性的更改将自动传播到基于该类型的域。

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

    您必须拥有要使用的类型改变类型.要更改类型的架构,您还必须具有创造新架构的特权。要更改所有者,您还必须是新所有者角色的直接或间接成员,并且该角色必须具有创造对类型架构的特权。(这些限制强制改变所有者不会做任何你不能通过删除和重新创建类型来做的事情。但是,超级用户无论如何都可以更改任何类型的所有权。)要添加属性或更改属性类型,您必须也有用法属性数据类型的特权。

# 参数

姓名

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

新名字

类型的新名称。

新主人

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

新模式

该类型的新架构。

属性名

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

新属性名称

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

数据类型

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

新枚举值

要添加到枚举类型的值列表的新值,或要赋予现有值的新名称。像所有枚举文字一样,它需要被引用。

邻居枚举值

在枚举类型的排序顺序之前或之后应立即添加新值的现有枚举值。像所有枚举文字一样,它需要被引用。

现有枚举值

应该重命名的现有枚举值。像所有枚举文字一样,它需要被引用。

财产

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

级联

自动将操作传播到正在更改的类型的类型表及其后代。

严格

如果要更改的类型是类型化表的类型,则拒绝该操作。这是默认设置。

# 笔记

如果改变类型...增加价值(向枚举类型添加新值的形式)在事务块内执行,直到事务提交后才能使用新值。

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

# 例子

要重命名数据类型:

ALTER TYPE electronic_mail RENAME TO email;

更改类型的所有者电子邮件

ALTER TYPE email OWNER TO joe;

更改类型的架构电子邮件顾客

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 扩展。

# 也可以看看

创建类型,掉落类型