ALTER TYPE
ALTER TYPE — 更改类型的定义
大纲
ALTER TYPEnameaction[, ... ] ALTER TYPEnameOWNER TO {new_owner| CURRENT_USER | SESSION_USER } ALTER TYPEnameRENAME ATTRIBUTEattribute_nameTOnew_attribute_name[ CASCADE | RESTRICT ] ALTER TYPEnameRENAME TOnew_nameALTER TYPEnameSET SCHEMAnew_schemaALTER TYPEnameADD VALUE [ IF NOT EXISTS ]new_enum_value[ { BEFORE | AFTER }neighbor_enum_value] ALTER TYPEnameRENAME VALUEexisting_enum_valueTOnew_enum_value其中action为以下之一: 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 更改现有类型的定义。有几种子形式:
ADD ATTRIBUTE该形式使用与 CREATE TYPE 相同的语法向复合类型添加新属性。
DROP ATTRIBUTE [ IF EXISTS ]这种形式从复合类型中删除一个属性。如果指定了
IF EXISTS而该属性不存在,则不会抛出错误,而是发出一条提示。SET DATA TYPE这种形式更改复合类型中某个属性的数据类型。
OWNER这种形式更改类型的拥有者。
RENAME该形式更改类型的名称或复合类型中单个属性的名称。
SET SCHEMA这种形式将类型移动到另一个模式中。
ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]这种形式向枚举类型中添加一个新值。可以用
BEFORE或AFTER指定该新值在枚举排序中的位置,即位于某个现有值之前或之后。否则,新项会被添加到值列表的末尾。如果指定了
IF NOT EXISTS,而该类型已经包含该新值,则不会报错:系统会发出一条提示,但不会执行任何其他操作。否则,如果该新值已存在,就会报错。RENAME VALUE这种形式重命名枚举类型中的一个值。该值在枚举排序中的位置不会受到影响。如果指定的值不存在,或者新名称已经存在,则会报错。
ADD ATTRIBUTE、DROP
ATTRIBUTE 和 ALTER ATTRIBUTE 操作可以组合成一个包含多项修改的列表,以便并行应用。例如,可以在一条命令中添加多个属性和/或更改多个属性的数据类型。
要使用 ALTER TYPE,必须拥有该类型。要更改类型的模式,还必须在新模式上拥有 CREATE 权限。要更改所有者,还必须是新所有者角色的直接或间接成员,并且该角色必须在类型所在模式上拥有 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应当被重命名的现有枚举值。与所有枚举字面量一样,它必须加引号。
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';
兼容性
添加和删除属性的这些变体属于 SQL 标准;其他变体则是 PostgreSQL 扩展。