ALTER TYPE — 更改一个类型的定义
ALTER TYPEname
action
[, ... ] ALTER TYPEname
OWNER TO {new_owner
| CURRENT_USER | SESSION_USER } ALTER TYPEname
RENAME ATTRIBUTEattribute_name
TOnew_attribute_name
[ CASCADE | RESTRICT ] ALTER TYPEname
RENAME TOnew_name
ALTER TYPEname
SET SCHEMAnew_schema
ALTER TYPEname
ADD VALUE [ IF NOT EXISTS ]new_enum_value
[ { BEFORE | AFTER }neighbor_enum_value
] ALTER TYPEname
RENAME VALUEexisting_enum_value
TOnew_enum_value
其中action
是下列之一: 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
更改一种现有类型的定义。
它有几种形式:
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 扩展。