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改变一个现有类型的定义。 有以下几种形式:
这种形式给复合类型增加新的属性,与CREATE TYPE命令语法相同。
这种形式从复合类型删除一个属性。如果指定了IF EXISTS选项,并且属性不存在时,不会有错误产生。在这种情况下系统仅会有一个通知。
这种形式改变一种复合类型中某个属性的类型。
这种形式改变类型的所有者。
这种形式改变类型的名称或是一个复合类型中的一个属性的名称。
这种形式将类型移至一个新的模式中。
这种形式给枚举类型增加一个新值。新值在枚举类型中的位置可通过对一个已有数值使用BEFORE或AFTER选项来指定。否则,新值会加在值列表的最后面。
如果使用了IF NOT EXISTS选项,即使枚举中已含有新值也不会报错,仅有通知。相反,新增一个枚举中已有的新值会产生错误提示。
自动级联更新需更新类型以及相关联的记录和继承它们的子表。
如果需联动更新类型是已更新类型的关联记录,则拒绝更新。这是缺省选项。
ADD ATTRIBUTE、DROP ATTRIBUTE和ALTER ATTRIBUTE选项可以组合成一个列表同时处理。 例如,在一条命令中同时增加几个属性或是更改几个属性的类型是可以实现的。
要使用ALTER TYPE,你必须是该类型的所有者。 要修改一个类型的模式,你还必须在新模式上拥有CREATE权限。 要修改所有者,你还必须是新的所有角色的直接或间接成员, 并且该成员必须在此类型的模式上有CREATE权限。 (这些限制强制了修改该所有者不会做任何通过删除和重建类型不能做的事情。 不过,超级用户可以以任何方式修改任意类型的所有权。 ) 要增加一个属性或是修改一个属性的类型,你也必须有该类型的USAGE权限。
一个需要修改的现有的类型的名字(可以有模式修饰) 。
该类型的新名称。
新所有者的用户名 。
该类型的新模式 。
拟增加、更改或删除的属性的名称。
拟改名的属性的新名称。
拟新增属性的数据类型,或是拟更改的属性的新类型名。
拟加入枚举类型值列表中的新值。和所有枚举参数一样,它必须使用引号引起来。
用于设定将要新增的枚举值在枚举中前后位置的已存在的枚举参考值。和所有枚举参数一样,它必须使用引号引起来。
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';