更新时间:2025-07-10 GMT+08:00

ALTER TYPE

功能描述

修改一个类型的定义。

注意事项

  • 要使用ALTER TYPE,必须是该类型的所有者。
  • 要修改类型的模式,还必须在新模式上拥有CREATE权限。
  • 要修改所有者,必须是新的所有角色的直接或间接成员, 并且该角色必须在此类型的模式上有CREATE权限。 这些限制强制要求修改所有者不能执行任何通过删除和重建该类型无法实现的操作。
  • 系统管理员拥有以任何方式修改任意类型的所有权。
  • 要增加一个属性或是修改一个属性的类型,也必须有该类型的USAGE权限。

语法格式

  • 修改类型。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    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 } neighbor_enum_value ]; 
    ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value;
    
    where action is one of:
        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 ];
    
  • 给复合类型增加新的属性。
    1
    ALTER TYPE name ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ];
    
  • 从复合类型删除一个属性。
    1
    ALTER TYPE name DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ];
    
  • 改变一种复合类型中某个属性的类型。
    1
    ALTER TYPE name ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ];
    

ADD ATTRIBUTE、DROP ATTRIBUTE和ALTER ATTRIBUTE选项可以组合成一个列表同时执行。 例如,在一条命令中同时增加多个属性或是更改多个属性的类型。

  • 改变类型的所有者。
    1
    ALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER };
    
  • 改变类型的名称或是一个复合类型中的一个属性的名称。
    1
    2
    ALTER TYPE name RENAME TO new_name;
    ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ];
    
  • 将类型移至一个新的模式中。
    1
    ALTER TYPE name SET SCHEMA new_schema;
    
  • 为枚举类型增加一个新值。
    1
    ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ];
    
  • 重命名枚举类型的一个标签值。
    1
    ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value;
    

参数说明

表1 ALTER TYPE参数说明

参数

描述

取值范围

name

需要修改的现有类型的名称,可以用模式修饰。

有效的类型名称。

new_name

类型的新名称。

字符串。

new_owner

类型新所有者的用户名 。

有效的用户名。

new_schema

类型的新模式 。

有效的模式名。

attribute_name

要增加、更改或删除的属性的名称。

-

new_attribute_name

要重命名的属性的新名称。

-

data_type

要新增属性的数据类型,或是要更改的属性的新类型名。

-

new_enum_value

枚举类型新增加的标签值。

字符串。非空且长度不超过64个字节。

neighbor_enum_value

一个已有枚举标签值,新值应该被增加在紧接着该枚举值之前或者之后的位置上。

-

existing_enum_value

现有的要重命名的枚举值。

字符串。非空且长度不超过64个字节。

CASCADE

自动级联更新需更新类型以及相关联的记录和继承它们的子表。

-

RESTRICT

如果需级联更新类型是已更新类型的关联记录,则拒绝更新。RESTRICT为缺省选项。

-

示例

创建示例复合类型test,枚举类型testdata和用户user_t。

1
2
3
CREATE TYPE test AS (col1 int, col text);
CREATE TYPE testdata AS ENUM ('create', 'modify', 'closed');
CREATE USER user_t PASSWORD '{Password}';

重命名数据类型test为test1。

1
ALTER TYPE test RENAME TO test1;

修改用户定义类型test1的所有者为user_t。

1
ALTER TYPE test1 OWNER TO user_t;

把用户定义类型test1的模式改为user_t。

1
ALTER TYPE test1 SET SCHEMA user_t;

给用户定义类型test1添加一个新的属性col3。

1
ALTER TYPE user_t.test1 ADD ATTRIBUTE col3 int;

给枚举类型testdata添加一个标签值。

1
ALTER TYPE testdata ADD VALUE IF NOT EXISTS 'regress' BEFORE 'closed';

重命名枚举类型testdata的一个标签值。

1
ALTER TYPE testdata RENAME VALUE 'create' TO 'new';

相关链接

CREATE TYPEDROP TYPE