2024年9月26日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

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 ( 属性 = [, ... ] )

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

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

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

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

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

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

  • SUBSCRIPT可以设置为特定于类型的下标处理程序函数的名称,或者设置为NONE以删除类型の下标处理程序函数。使用此选项需要超级用户权限。

  • STORAGE可以设置为plainextendedexternalmain(有关这些含义的更多信息,请参阅第 65.2 节)。但是,从plain更改为另一个设置需要超级用户权限(因为它要求类型的 C 函数都准备好使用 TOAST),并且完全不允许从另一个设置更改为plain(因为类型可能已经具有数据库中存在的 TOASTed 值)。请注意,更改此选项本身不会更改任何存储的数据,它只是设置将来创建的表列将使用的默认 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

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用此表单报告文档问题。