========== ALTER TYPE ========== .. container:: refentry :name: SQL-ALTERTYPE .. container:: titlepage .. container:: refnamediv .. rubric:: ALTER TYPE :name: alter-type ALTER TYPE — 更改一个类型的定义 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis 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 这里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 ] .. container:: refsect1 :name: id-1.9.3.42.5 .. rubric:: 描述 :name: 描述 ``ALTER TYPE``\ 更改一种现有类型的定义。 它有几种形式: .. container:: variablelist ``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``\ ,该类型已经包含新值时不会发生 错误:会发出一个提示但是不采取其他行动。否则,如果新值已经存在会发生错误。 ``RENAME VALUE`` 该形式重命名枚举类型的值。该值在枚举排序中的位置不受影响。 如果指定的值不存在或新名称已存在,则会发生错误。 ``ADD ATTRIBUTE``\ 、\ ``DROP ATTRIBUTE``\ 和\ ``ALTER ATTRIBUTE``\ 动作 可以被整合到一个多个修改组成的列表中,以便被平行应用。例如, 可以在一个命令中增加多个属性并且/或者修改多个属性的类型。 要使用\ ``ALTER TYPE``\ ,你必须拥有该类型。要更改 一个类型的模式,你还必须拥有新模式上的 ``CREATE``\ 特权。要更改拥有者,你还必须 是新拥有角色的一个直接或者间接成员,并且该角色必须具有该类型的模式上的 ``CREATE``\ 特权(这些限制强制修改拥有者不能做一些通过删除和重 建该类型做不到的事情。不过,一个超级用户怎么都能更改任何类型的所有权。)。 要增加一个属性或者修改一个属性类型,你还必须具有该数据类型上的 ``USAGE``\ 特权。 .. container:: refsect1 :name: id-1.9.3.42.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``name``* 要修改的一个现有类型的名称(可能被模式限定)。 *``new_name``* 该类型的新名称。 *``new_owner``* 该类型新拥有者的用户名。 *``new_schema``* 该类型的新模式。 *``attribute_name``* 要增加、修改或者删除的属性名称。 *``new_attribute_name``* 要被重命名的属性的新名称。 *``data_type``* 要增加的属性的数据类型,或者是要修改的属性的新类型。 *``new_enum_value``* 要被增加到一个枚举类型的值列表的新值,或将赋予现有值的新名称。 和所有枚举文本一样,它需要被引号引用。 *``neighbor_enum_value``* 一个现有枚举值,新值应该被增加在紧接着该枚举值之前或者 之后的位置上。和所有枚举文本一样,它需要被引号引用。 *``existing_enum_value``* 现有的应该重命名的枚举值。和所有的枚举文本一样,它需要被引号引用。 ``CASCADE`` 自动将操作传播到被更改类型的类型表及其后代。 ``RESTRICT`` 如果被更改的类型是类型表的类型,则拒绝该操作。这是默认设置。 .. container:: refsect1 :name: id-1.9.3.42.7 .. rubric:: 注解 :name: 注解 如果\ ``ALTER TYPE ... ADD VALUE``\ (增加一个新值到枚举类型的形式) 不能在一个事务块中执行,新值不能被使用直到事务被提交之后。 涉及到一个新增加枚举值的比较有时会被只涉及原始枚举值的比较更慢。这通常 只会在利用\ ``BEFORE``\ 或者\ ``AFTER``\ 来把新值的 排序位置设置为非列表结尾的地方时发生。不过,有时候即使把新值增加到最后时 也会发生这种情况(如果创建了该枚举类型之后出现过 OID 计数器 “回卷”,就会发生这种情况)。这种减速通常不明显,但是如果它确实 带来了麻烦,通过删除并且重建该枚举类型或者转储并且重载整个数据库可以重新 得到最优性能。 .. container:: refsect1 :name: id-1.9.3.42.8 .. rubric:: 示例 :name: 示例 要重命名一个数据类型: .. code:: programlisting ALTER TYPE electronic_mail RENAME TO email; 把类型\ ``email``\ 的拥有者改为 ``joe``\ : .. code:: programlisting ALTER TYPE email OWNER TO joe; 把类型\ ``email``\ 的模式改为 ``customers``\ : .. code:: programlisting ALTER TYPE email SET SCHEMA customers; 增加一个新属性到一个类型: .. code:: programlisting ALTER TYPE compfoo ADD ATTRIBUTE f3 int; 在一个特定的排序位置上为一个枚举类型增加一个新值: .. code:: programlisting ALTER TYPE colors ADD VALUE 'orange' AFTER 'red'; 重命名一个枚举值: .. code:: programlisting ALTER TYPE colors RENAME VALUE 'purple' TO 'mauve'; .. container:: refsect1 :name: id-1.9.3.42.9 .. rubric:: 兼容性 :name: 兼容性 增加和删除属性的变体是 SQL 标准的一部分,而其他变体是 OushuDB 扩展。 .. container:: refsect1 :name: SQL-ALTERTYPE-SEE-ALSO .. rubric:: 另见 :name: 另见 `CREATE TYPE `__, `DROP TYPE `__