选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.5 已于 2021 年 2 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

ALTER TYPE

ALTER TYPE — 更改类型的定义

大纲

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 } 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更改现有类型的定义。有几种子形式:

ADD ATTRIBUTE

该形式使用与CREATE TYPE相同的语法向复合类型添加新属性。

DROP ATTRIBUTE [ IF EXISTS ]

这种形式从复合类型中删除一个属性。 如果指定了IF EXISTS而该属性不存在,则不会抛出错误, 而是发出一条提示。

SET DATA TYPE

这种形式更改复合类型中某个属性的数据类型。

OWNER

这种形式更改类型的拥有者。

RENAME

该形式更改类型的名称或复合类型中单个属性的名称。

SET SCHEMA

这种形式将类型移动到另一个模式中。

ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]

这种形式向枚举类型中添加一个新值。可以用 BEFOREAFTER 指定该新值在枚举排序中的位置,即位于某个现有值之前或之后。 否则,新项会被添加到值列表的末尾。

如果指定了 IF NOT EXISTS,而该类型已经包含该新值, 则不会报错:系统会发出一条提示,但不会执行任何其他操作。 否则,如果该新值已存在,就会报错。

CASCADE

自动将该操作传播到正在修改的类型的类型化表及其后代。

RESTRICT

如果正在修改的类型是某个类型化表的类型,则拒绝该操作。 这是默认行为。

ADD ATTRIBUTEDROP ATTRIBUTEALTER ATTRIBUTE 操作 可以组合成一个包含多项修改的列表,以便并行应用。 例如,可以在一条命令中添加多个属性和/或更改多个属性的数据类型。

要使用ALTER TYPE,必须拥有该类型。要更改类型的模式,还必须在新模式上拥有CREATE权限。要更改所有者,还必须是新所有者角色的直接或间接成员,并且该角色必须在类型所在模式上拥有CREATE权限。(这些限制确保更改所有者不会执行任何无法通过删除并重新创建类型完成的操作。不过,超级用户无论如何都可以更改任何类型的所有权。)要添加属性或更改属性类型,还必须在该属性的数据类型上拥有USAGE权限。

参数

name

要修改的现有类型的名称(可以是模式限定的)。

new_name

该类型的新名称。

new_owner

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

new_schema

该类型的新模式。

attribute_name

要添加、修改或删除的属性名称。

new_attribute_name

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

data_type

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

new_enum_value

要添加到枚举类型值列表中的新值。 与所有枚举字面量一样,它必须加引号。

existing_enum_value

一个现有枚举值;在枚举类型的排序顺序中,新值会紧邻该值, 被添加到它之前或之后。与所有枚举字面量一样,它必须加引号。

注解

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

涉及新增枚举值的比较有时会比只涉及枚举类型原有成员的比较慢。通常只有在使用BEFOREAFTER将新值的排序位置设置在列表末尾以外时,才会发生这种情况。但是,即使新值添加在末尾,有时也会发生这种情况(如果自枚举类型最初创建以来 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';

兼容性

添加和删除属性的这些变体属于 SQL 标准;其他变体则是 PostgreSQL 扩展。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。