ALTER TYPE

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

概要

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 ]
ALTER TYPE name SET DEFAULT ENCODING ( storage_directive )

其中 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 ]

其中 storage_directive 是:

   COMPRESSTYPE={ZLIB | ZSTD | QUICKLZ | RLE_TYPE | NONE}
   COMPRESSLEVEL={0-19}
   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 操作组合为多个更改列表,以并行应用。 例如,可以在单个命令中添加多个属性和/或更改多个属性的类型。

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

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

您必须拥有该类型才能使用 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 以指定使用的压缩类型。
    COMPRESSLEVEL — 对于 ZSTD 压缩,将其设置为 1(最快压缩)到 19(最高压缩率)之间的整数值。 对于 ZLIB 压缩,有效范围是 1 到 9。对于 RLE_TYPE,压缩级别可以设置为从 1(最快压缩)到 4(最高压缩率)的整数值。缺省压缩级别为 1。
    BLOCKSIZE — 设置为列中每个块的大小(以字节为单位)。 BLOCKSIZE 必须介于 8192 和 2097152 字节之间,并且是 8192 的倍数。默认块大小为 32768。

示例

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

ALTER TYPE electronic_mail RENAME TO email;

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

ALTER TYPE email OWNER TO joe;

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

ALTER TYPE email SET SCHEMA customers;

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

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

要将新属性添加到类型:

ALTER TYPE compfoo ADD ATTRIBUTE f3 int;

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

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

兼容性

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

另见

CREATE TYPEDROP TYPE