↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

Wiki / SQL 命令

ALTER TYPE

更改类型的定义

英文手册覆盖始于 PostgreSQL 6.4. 来源历史与运行验证各自保留独立版本边界。

当前阅读 PG 18·选择有来源记录的版本

anchor
SQL-ALTERTYPE
file
sql-altertype.html
lang
en
name
ALTER TYPE
purpose
change the definition of a type
purpose zh
未知
sections same as
未知
slug
18

语法

ALTER TYPE name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER TYPE name RENAME TO new_name
ALTER TYPE name SET SCHEMA new_schema
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
ALTER TYPE name action [, ... ]
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
ALTER TYPE name SET ( property = 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 ]
语法图

从左向右阅读;分支表示选择,旁路表示可选,循环表示重复。点击带下划线的参数可打开对应规则。

ALTER TYPE name OWNER TO new_owner CURRENT_ROLE CURRENT_USER SESSION_USER
ALTER TYPE · 语法 2
ALTER TYPE name RENAME TO new_name
ALTER TYPE · 语法 3
ALTER TYPE name SET SCHEMA new_schema
ALTER TYPE · 语法 4
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name CASCADE RESTRICT
ALTER TYPE · 语法 5
ALTER TYPE name action ,
ALTER TYPE · 语法 6
ALTER TYPE name ADD VALUE IF NOT EXISTS new_enum_value BEFORE AFTER neighbor_enum_value
ALTER TYPE · 语法 7
ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
ALTER TYPE · 语法 8
ALTER TYPE name SET ( property = 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

版本定义 PG 18

ALTER TYPE name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER TYPE name RENAME TO new_name
ALTER TYPE name SET SCHEMA new_schema
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
ALTER TYPE name action [, ... ]
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
ALTER TYPE name SET ( property = 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 更改现有类型的定义。它有以下几种子形式:

OWNER

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

RENAME

这种形式更改类型的名称。

SET SCHEMA

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

RENAME ATTRIBUTE

这种形式只能用于复合类型。它会更改该类型某个属性的名称。

ADD ATTRIBUTE

这种形式向复合类型添加一个新属性,其语法与 CREATE TYPE 相同。

DROP ATTRIBUTE [ IF EXISTS ]

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

ALTER ATTRIBUTE ... SET DATA TYPE

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

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

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

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

RENAME VALUE

这种形式重命名枚举类型中的一个值。该值在枚举排序中的位置不会受到影响。如果指定的值不存在,或者新名称已经存在,则会报错。

SET ( property = value [, ... ] )

这种形式仅适用于基础类型。它允许调整可在 CREATE TYPE 中设置的一部分基础类型属性。具体可以更改的属性如下:

  • 可以将RECEIVE设置为二进制输入函数的名称,或者设置为NONE以移除该类型的二进制输入函数。使用此选项需要超级用户权限。

  • 可以将SEND设置为二进制输出函数的名称,或者设置为NONE以移除该类型的二进制输出函数。使用此选项需要超级用户权限。

  • 可以将TYPMOD_IN设置为类型修饰符输入函数的名称,或者设置为NONE以移除该类型的类型修饰符输入函数。使用此选项需要超级用户权限。

  • 可以将TYPMOD_OUT设置为类型修饰符输出函数的名称,或者设置为NONE以移除该类型的类型修饰符输出函数。使用此选项需要超级用户权限。

  • 可以将ANALYZE设置为类型专用的统计信息收集函数的名称,或者设置为NONE以移除该类型的统计信息收集函数。使用此选项需要超级用户权限。

  • 可以将SUBSCRIPT设置为类型专用的下标处理函数的名称,或者设置为NONE以移除该类型的下标处理函数。使用此选项需要超级用户权限。

  • 可以将STORAGE设置为plain、extended、external或 main(关于这些设置含义的更多信息,见第 66.2 节)。但是,从plain改为其他设置需要超级用户权限(因为这要求该类型的 C 函数全部都能处理 TOAST),而从其他设置改为 plain则完全不允许(因为数据库中可能已经存在该类型经过 TOAST 处理的值)。请注意,更改该选项本身不会改变任何已存储的数据,它只是为将来创建的表列设置默认的 TOAST 策略。要更改现有表列的 TOAST 策略,请参见ALTER TABLE。

关于这些类型属性的更多细节,请参见CREATE TYPE。请注意,在适当情况下,对基础类型这些属性的更改会自动传播到基于该类型的域。

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

要使用 ALTER TYPE,你必须拥有该类型。要更改类型所在的模式,你还必须在新模式上拥有 CREATE 权限。要更改拥有者,你必须能够对新的拥有角色执行 SET ROLE,并且该角色必须在该类型所在的模式上拥有 CREATE 权限。(这些限制确保,更改拥有者不会做出任何你不能通过删除并重新创建该类型来完成的事情。不过,超级用户仍然可以更改任何类型的所有权。)要添加属性或更改属性的数据类型,你还必须对该属性的数据类型拥有 USAGE 权限。

参数

name

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

new_name

该类型的新名称。

new_owner

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

new_schema

该类型的新模式。

attribute_name

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

new_attribute_name

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

data_type

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

new_enum_value

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

neighbor_enum_value

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

existing_enum_value

应当被重命名的现有枚举值。与所有枚举字面量一样,它必须加引号。

property

要修改的基础类型属性名称;可能的取值见上文。

CASCADE

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

RESTRICT

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

注解

如果在事务块中执行 ALTER TYPE ... ADD VALUE(即向枚举类型添加新值的形式),则在事务提交之后才能使用该新值。

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

要重命名一个枚举值:

ALTER TYPE colors RENAME VALUE 'purple' TO 'mauve';

要为现有基础类型创建二进制 I/O 函数:

CREATE FUNCTION mytypesend(mytype) RETURNS bytea ...;
CREATE FUNCTION mytyperecv(internal, oid, integer) RETURNS mytype ...;
ALTER TYPE mytype SET (
    SEND = mytypesend,
    RECEIVE = mytyperecv
);

兼容性

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

另见

CREATE TYPE, DROP TYPE

比较版本

完整来源事实

synopsis html

ALTER TYPE <em class="replaceable"><code>name</code></em> OWNER TO { <em class="replaceable"><code>new_owner</code></em> | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER TYPE <em class="replaceable"><code>name</code></em> RENAME TO <em class="replaceable"><code>new_name</code></em>
ALTER TYPE <em class="replaceable"><code>name</code></em> SET SCHEMA <em class="replaceable"><code>new_schema</code></em>
ALTER TYPE <em class="replaceable"><code>name</code></em> RENAME ATTRIBUTE <em class="replaceable"><code>attribute_name</code></em> TO <em class="replaceable"><code>new_attribute_name</code></em> [ CASCADE | RESTRICT ]
ALTER TYPE <em class="replaceable"><code>name</code></em> <em class="replaceable"><code>action</code></em> [, ... ]
ALTER TYPE <em class="replaceable"><code>name</code></em> ADD VALUE [ IF NOT EXISTS ] <em class="replaceable"><code>new_enum_value</code></em> [ { BEFORE | AFTER } <em class="replaceable"><code>neighbor_enum_value</code></em> ]
ALTER TYPE <em class="replaceable"><code>name</code></em> RENAME VALUE <em class="replaceable"><code>existing_enum_value</code></em> TO <em class="replaceable"><code>new_enum_value</code></em>
ALTER TYPE <em class="replaceable"><code>name</code></em> SET ( <em class="replaceable"><code>property</code></em> = <em class="replaceable"><code>value</code></em> [, ... ] )

<span class="phrase">where <em class="replaceable"><code>action</code></em> is one of:</span>

    ADD ATTRIBUTE <em class="replaceable"><code>attribute_name</code></em> <em class="replaceable"><code>data_type</code></em> [ COLLATE <em class="replaceable"><code>collation</code></em> ] [ CASCADE | RESTRICT ]
    DROP ATTRIBUTE [ IF EXISTS ] <em class="replaceable"><code>attribute_name</code></em> [ CASCADE | RESTRICT ]
    ALTER ATTRIBUTE <em class="replaceable"><code>attribute_name</code></em> [ SET DATA ] TYPE <em class="replaceable"><code>data_type</code></em> [ COLLATE <em class="replaceable"><code>collation</code></em> ] [ CASCADE | RESTRICT ]

synopsis text

ALTER TYPE name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER TYPE name RENAME TO new_name
ALTER TYPE name SET SCHEMA new_schema
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
ALTER TYPE name action [, ... ]
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
ALTER TYPE name SET ( property = 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 ]

来源引用

完整定义与证据 JSON

定义来源

center · PostgreSQL 18 · a709ab85

正文语言: zh-Hans · 1b5ca64c