ALTER TYPE
更改一种现有类型的定义。
简介
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
删除该类型的统计信息收集功能。 使用此选项需要超级用户特权。可以将
STORAGE
设置为plain
,extended
,external
, 或main
。 但是,从plain
更改为另一个设置需要超级用户特权(因为它要求该类型的 C 函数全部是 TOAST-ready), 而从另一个设置更改为plain
则不是完全允许(因为类型可能已经在数据库中包含 TOASTed 值)。 请注意,更改此选项本身并不会更改任何存储的数据,它只是设置默认的 TOAST 策略以用于将来创建的表列。 请参见 ALTER TABLE 更改现有表列的 TOAST 策略。
请注意,在适当的情况下,基本类型的这些属性中的更改将自动传播到基于该类型的域。
ADD ATTRIBUTE
、DROP ATTRIBUTE
和ALTER ATTRIBUTE
动作可以被整合到一个多个修改组成的列表中,以便被平行应用。例如, 可以在一个命令中增加多个属性并且/或者修改多个属性的类型。
要使用ALTER TYPE
,你必须拥有该类型。要更改一个类型的模式,你还必须拥有新模式上的 CREATE
特权。要更改拥有者,你还必须是新拥有角色的一个直接或者间接成员,并且该角色必须具有该类型的模式上的 CREATE
特权(这些限制强制修改拥有者不能做一些通过删除和重建该类型做不到的事情。不过,一个超级用户怎么都能更改任何类型的所有权。)。 要增加一个属性或者修改一个属性类型,你还必须具有该属性数据类型上的 USAGE
特权。
语法
ALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER TYPE name RENAME TO new_name
ALTER TYPE name SET SCHEMA new_schema
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
ALTER TYPE name action [, ... ]
ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ]
ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
ALTER TYPE name SET ( property = 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 ]
参数
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
);