ALTER TYPE
Name
ALTER TYPE -- 修改一个类型的定义。
Synopsis
ALTER TYPE _name_ _action_ [, ... ]
ALTER TYPE _name_ OWNER TO _new_owner_
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';
兼容性
增加或删除属性是SQL标准,其他选项都是PostgreSQL的扩展。