ALTER TYPE — 更改类型的定义
ALTER TYPEname
OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER TYPEname
RENAME TOnew_name
ALTER TYPEname
SET SCHEMAnew_schema
ALTER TYPEname
RENAME ATTRIBUTEattribute_name
TOnew_attribute_name
[ CASCADE | RESTRICT ] ALTER TYPEname
action
[, ... ] ALTER TYPEname
ADD VALUE [ IF NOT EXISTS ]new_enum_value
[ { BEFORE | AFTER }neighbor_enum_value
] ALTER TYPEname
RENAME VALUEexisting_enum_value
TOnew_enum_value
ALTER TYPEname
SET (property
=value
[, ... ] ) whereaction
is one of: ADD ATTRIBUTEattribute_name
data_type
[ COLLATEcollation
] [ CASCADE | RESTRICT ] DROP ATTRIBUTE [ IF EXISTS ]attribute_name
[ CASCADE | RESTRICT ] ALTER ATTRIBUTEattribute_name
[ SET DATA ] TYPEdata_type
[ COLLATEcollation
] [ 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 ]
此表单向枚举类型添加新值。新值的枚举顺序位置可以指定为现有值之一的 BEFORE
或 AFTER
。否则,新项将添加到值列表的末尾。
如果指定 IF NOT EXISTS
,则类型已包含新值时不会出错:将发出通知,但不会执行其他操作。否则,如果新值已存在,则会发生错误。
RENAME VALUE
此表单重命名枚举类型的某个值。该值在枚举顺序中的位置不受影响。如果指定的 value 不存在或新名称已存在,则会发生错误。
SET ( property
= value
[, ... ] )
此表单仅适用于基本类型。它允许调整可在 CREATE TYPE
中设置的基本类型属性的子集。具体来说,可以更改以下属性
RECEIVE
可以设置为二进制输入函数的名称,也可以设置为 NONE
以删除类型的二进制输入函数。使用此选项需要超级用户权限。
SEND
可以设置为二进制输出函数的名称,也可以设置为 NONE
以删除类型的二进制输出函数。使用此选项需要超级用户权限。
TYPMOD_IN
可以设置为类型修改器输入函数的名称,也可以设置为 NONE
以删除类型的类型修改器输入函数。使用此选项需要超级用户权限。
TYPMOD_OUT
可以设置为类型修改器输出函数的名称,也可以设置为 NONE
以删除类型的类型修改器输出函数。使用此选项需要超级用户权限。
ANALYZE
可以设置为特定于类型的统计信息收集函数的名称,或 NONE
以移除该类型的统计信息收集函数。使用此选项需要超级用户权限。
SUBSCRIPT
可以设置为特定于类型的下标处理函数的名称,或 NONE
以移除该类型的下标处理函数。使用此选项需要超级用户权限。
STORAGE
可以设置为 plain
、extended
、external
或 main
(有关这些含义的更多信息,请参见 第 73.2 节)。但是,从 plain
更改为其他设置需要超级用户权限(因为它要求该类型的 C 函数全部为 TOAST 就绪),并且根本不允许从其他设置更改为 plain
(因为该类型可能已经在数据库中存在 TOAST 值)。请注意,更改此选项本身不会更改任何存储的数据,它只是设置将来为表列创建时要使用的默认 TOAST 策略。请参见 ALTER TABLE 以更改现有表列的 TOAST 策略。
有关这些类型属性的更多详细信息,请参见 CREATE TYPE。请注意,在适当的情况下,基本类型的这些属性的更改将自动传播到基于该类型的域。
ADD ATTRIBUTE
、DROP ATTRIBUTE
和 ALTER ATTRIBUTE
操作可以组合成一个并行应用的多重变更列表。例如,可以在一个命令中添加多个属性和/或更改多个属性的类型。
您必须拥有该类型才能使用 ALTER TYPE
。要更改类型的架构,您还必须对新架构拥有 CREATE
权限。要更改所有者,您必须能够将 SET ROLE
设置为新的所有者角色,并且该角色必须对该类型的架构拥有 CREATE
权限。(这些限制强制要求更改所有者不会执行您无法通过删除和重新创建该类型来执行的任何操作。但是,无论如何,超级用户都可以更改任何类型的拥有权。)要添加属性或更改属性类型,您还必须对该属性的数据类型拥有 USAGE
权限。
name
要更改的现有类型的名称(可能经过架构限定)。
new_name
该类型的名称。
new_owner
该类型的新所有者的用户名。
new_schema
该类型的新架构。
属性名称
要添加、更改或删除的属性的名称。
new_attribute_name
要重命名的属性的新名称。
data_type
要添加的属性的数据类型,或要更改的属性的新类型。
new_enum_value
要添加到枚举类型值列表的新值,或要赋予现有值的新名称。与所有枚举文字一样,它需要加引号。
neighbor_enum_value
新值在枚举类型的排序顺序中应紧接其前或紧接其后的现有枚举值。与所有枚举文字一样,它需要加引号。
existing_enum_value
应重命名的现有枚举值。与所有枚举文字一样,它需要加引号。
property
要修改的基本类型属性的名称;有关可能的值,请参见上方。
CASCADE
自动将操作传播到正在更改的类型的类型化表及其后代。
RESTRICT
如果正在更改的类型是类型化表的类型,则拒绝该操作。这是默认设置。
如果 ALTER TYPE ... ADD VALUE
(将新值添加到枚举类型的形式)在事务块内执行,则在事务提交后才能使用新值。
涉及已添加枚举值的比较有时会比仅涉及枚举类型的原始成员的比较慢。通常只有在使用 BEFORE
或 AFTER
将新值的排序位置设置为列表末尾以外的位置时才会发生这种情况。但是,有时即使在新值末尾添加也会发生这种情况(如果 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 扩展。