ALTER TYPE — 更改类型的定义
ALTER TYPEnameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER TYPEnameRENAME TOnew_nameALTER TYPEnameSET SCHEMAnew_schemaALTER TYPEnameRENAME ATTRIBUTEattribute_nameTOnew_attribute_name[ CASCADE | RESTRICT ] ALTER TYPEnameaction[, ... ] ALTER TYPEnameADD VALUE [ IF NOT EXISTS ]new_enum_value[ { BEFORE | AFTER }neighbor_enum_value] ALTER TYPEnameRENAME VALUEexisting_enum_valueTOnew_enum_valueALTER TYPEnameSET (property=value[, ... ] ) whereactionis one of: ADD ATTRIBUTEattribute_namedata_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此形式重命名枚举类型的值。该值在枚举排序中的位置不受影响。如果指定的值不存在或新名称已存在,则会报错。
SET ( property = value [, ... ] )此形式仅适用于基本类型。它允许调整可在 CREATE TYPE 中设置的基本类型属性的子集。具体来说,可以更改以下属性:
RECEIVE 可设置为二进制输入函数的名称,或设置为 NONE 以删除类型的二进制输入函数。使用此选项需要超级用户权限。
SEND 可设置为二进制输出函数的名称,或设置为 NONE 以删除类型的二进制输出函数。使用此选项需要超级用户权限。
TYPMOD_IN 可设置为类型修饰符输入函数的名称,或设置为 NONE 以删除类型的类型修饰符输入函数。使用此选项需要超级用户权限。
TYPMOD_OUT 可设置为类型修饰符输出函数的名称,或设置为 NONE 以删除类型的类型修饰符输出函数。使用此选项需要超级用户权限。
ANALYZE 可设置为类型特定统计信息收集函数的名称,或设置为 NONE 以删除类型的统计信息收集函数。使用此选项需要超级用户权限。
SUBSCRIPT 可设置为类型特定下标处理函数的名称,或设置为 NONE 以删除类型的下标处理函数。使用此选项需要超级用户权限。
STORAGE 可设置为 plain、extended、external 或 main(有关这些含义的更多信息,请参阅 第 66.2 节)。但是,从 plain 更改为其他设置需要超级用户权限(因为它要求类型的 C 函数都已准备好 TOAST),而从其他设置更改为 plain 是完全不允许的(因为该类型可能已在数据库中存在 TOASTed 值)。请注意,更改此选项本身不会更改任何存储的数据,它只是设置将用于将来创建的表列的默认 TOAST 策略。有关更改现有表列的 TOAST 策略,请参阅 ALTER TABLE。
有关这些类型属性的更多详细信息,请参阅 CREATE TYPE。请注意,在适用的情况下,对基本类型进行的这些属性的更改将自动传播到基于该类型的域。
可以 ADD ATTRIBUTE、DROP ATTRIBUTE 和 ALTER 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(添加新值到枚举类型的形式),则在事务提交之前无法使用新值。
涉及添加的枚举值的比较有时会比仅涉及枚举类型的原始成员的比较慢。这通常只发生在使用了 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 扩展。