ALTER TYPE

更改一个数据类型的定义。

概要

  1. ALTER TYPE name action [, ... ]
  2. ALTER TYPE name OWNER TO new_owner
  3. ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
  4. ALTER TYPE name RENAME TO new_name
  5. ALTER TYPE name SET SCHEMA new_schema
  6. ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } existing_enum_value ]
  7. ALTER TYPE name SET DEFAULT ENCODING ( storage_directive )
  8. 其中 action是下列选项之一:
  9. ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
  10. DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ]
  11. ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]

其中 storage_directive是:

  1. COMPRESSTYPE={ZLIB | ZSTD | QUICKLZ | RLE_TYPE | NONE}
  2. COMPRESSLEVEL={0-19}
  3. BLOCKSIZE={8192-2097152}

描述

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操作组合为多个更改列表,以并行应用。 例如,可以在单个命令中添加多个属性和/或更改多个属性的类型。

您可以更改名称,所有者和类型的架构。 您还可以添加或更新标量类型的存储选项。

Note: Greenplum数据库不支持为行或复合类型添加存储选项。

您必须拥有该类型才能使用ALTER TYPE。 要更改类型的架构,您还必须对新架构具有CREATE特权。 要更改所有者,您还必须是新拥有角色的直接或间接成员,并且该角色必须对类型的架构具有CREATE特权。 (这些限制迫使更改所有者不能执行删除和重新创建类型的任何操作。但是,超级用户可以更改任何类型的所有权。)要添加属性或更改属性类型,还必须具有USAGE数据类型的特权。

ALTER TYPE … ADD VALUE (向枚举类型添加新值的形式)不能在事务块内执行。

涉及增加的枚举值的比较有时会比仅涉及枚举类型的原始成员的比较慢。 通常只有在使用BEFORE或AFTER设置新值的排序位置(而不是列表的末尾)时,才会发生这种情况。 但是,有时即使将新值添加到末尾也会发生(如果自从最初创建枚举类型以来,OID计数器“环绕”,就会发生这种情况)。 增长速度通常很小。 但是,如果重要的话,可以通过删除并重新创建枚举类型,或者通过转储并重新加载数据库来获得最佳性能。

参数

name

要更改的现有类型的名称(可选的模式限定)。

new_name

类型的新名称。

new_owner

该类型的新所有者的用户名。

new_schema

类型的新架构。

attribute_name

要添加,更改或删除的属性的名称。

new_attribute_name

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

data_type

要添加的属性的数据类型,或要更改的属性的新类型。

new_enum_value

要添加的属性的数据类型,或要更改的属性的新类型。

existing_enum_value

应该在枚举类型的排序顺序之前或之后立即添加新值的现有枚举值。 像所有枚举文字一样,也需要用引号引起来。

storage_directive

在表列定义中指定时,标识该类型的默认存储选项。 选项包括COMPRESSTYPE,COMPRESSLEVEL和BLOCKSIZE。

COMPRESSTYPE — 设置为ZLIB(默认设置),ZSTD,RLE_TYPE或QUICKLZ1以指定使用的压缩类型。

Note: 1QuickLZ压缩仅在商业版本的Pivotal Greenplum数据库中可用。

COMPRESSLEVEL — 对于Zstd压缩,将其设置为1(最快压缩)到19(最高压缩率)之间的整数值。 对于zlib压缩,有效范围是1到9。QuickLZ压缩级别只能设置为1。对于RLE_TYPE,压缩级别可以设置为从1(最快压缩)到4(最高压缩率)的整数值。缺省压缩级别为1。

BLOCKSIZE — 设置为列中每个块的大小(以字节为单位)。 BLOCKSIZE必须介于8192和2097152字节之间,并且是8192的倍数。默认块大小为32768。

Note: 在表或列级别定义的storage_directives 会覆盖为类型定义的默认存储选项。

示例

要重命名名为electronic_mail的数据类型:

  1. ALTER TYPE electronic_mail RENAME TO email;

更改用户自定义类型email的所有者为joe:

  1. ALTER TYPE email OWNER TO joe;

更改用户自定义类型email的模式为customers:

  1. ALTER TYPE email SET SCHEMA customers;

设置或更改名为int33的用户定义类型的压缩类型和压缩级别:

  1. ALTER TYPE int33 SET DEFAULT ENCODING (compresstype=zlib, compresslevel=7);

要将新属性添加到类型:

  1. ALTER TYPE compfoo ADD ATTRIBUTE f3 int;

要将新值添加到特定排序位置的枚举类型:

  1. ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';

兼容性

添加和删除属性的变体是SQL标准的一部分。 其他变体是Greenplum数据库扩展。

另见

CREATE TYPE, DROP TYPE

Parent topic: SQL Command Reference