ALTER TYPE
大纲
ALTER TYPE name action [, ... ]
ALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
ALTER TYPE name RENAME TO new_name
ALTER TYPE name SET SCHEMA new_schema
ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } existing_enum_value ]
这里action 是以下之一:
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更改一种现有类型的定义。 它有几种形式:
- 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,该类型已经包含新值时不会发生 错误:会发出一个提示但是不采取其他行动。否则,如果新值已经存在会发生错误。
- CASCADE
-
自动把该操作传播给使用被修改类型的类型化表及其后代表。
- RESTRICT
-
如果被修改的类型是一个类型化表的类型,则拒绝该操作。 这是默认值。
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
-
要被增加到一个枚举类型的值列表的新值。和所有枚举文本一样, 它需要被引号引用。
- existing_enum_value
-
一个现有枚举值,新值应该被增加在紧接着该枚举值之前或者 之后的位置上。和所有枚举文本一样,它需要被引号引用。
注解
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';