2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

ALTER TYPE

ALTER TYPE — 更改型別的定義

概要

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 更改現有型別的定義。有幾種子形式。

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 ]

此形式將一個新值新增到列舉型別。新值在列舉的排序中的位置可以指定為 BEFOREAFTER 現有值之一。否則,新項將被新增到值列表的末尾。

如果指定了 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 可設定為 plainextendedexternalmain(有關這些含義的更多資訊,請參閱 第 66.2 節)。但是,從 plain 更改為其他設定需要超級使用者許可權(因為它要求型別的 C 函式都已準備好 TOAST),而從其他設定更改為 plain 是完全不允許的(因為該型別可能已在資料庫中存在 TOASTed 值)。請注意,更改此選項本身不會更改任何儲存的資料,它只是設定將用於將來建立的表列的預設 TOAST 策略。有關更改現有表列的 TOAST 策略,請參閱 ALTER TABLE

有關這些型別屬性的更多詳細資訊,請參閱 CREATE TYPE。請注意,在適用的情況下,對基本型別進行的這些屬性的更改將自動傳播到基於該型別的域。

可以 ADD ATTRIBUTEDROP ATTRIBUTEALTER 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(新增新值到列舉型別的形式),則在事務提交之前無法使用新值。

涉及新增的列舉值的比較有時會比僅涉及列舉型別的原始成員的比較慢。這通常只發生在使用了 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';

重新命名列舉值

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 TYPEDROP TYPE

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。