支援的版本: 目前 (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(有關這些含義的更多資訊,請參閱 第 65.2 節)。 但是,從 plain 變更為其他設定需要超級使用者權限(因為它要求類型的 C 函數都已準備好 TOAST),並且完全不允許從其他設定變更為 plain(因為該類型可能已在資料庫中存在 TOASTed 值)。 請注意,變更此選項本身不會變更任何儲存的資料,它只會設定未來建立的資料表欄位要使用的預設 TOAST 策略。 請參閱 ALTER TABLE 以變更現有資料表欄位的 TOAST 策略。

有關這些類型屬性的更多詳細資訊,請參閱 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

要新增到 enum 類型的值列表中的新值,或要給予現有值的新名稱。與所有 enum 常值一樣,它需要用引號括起來。

neighbor_enum_value

現有的 enum 值,新值應緊接在其之前或之後新增到 enum 類型的排序順序中。與所有 enum 常值一樣,它需要用引號括起來。

existing_enum_value

應該重新命名的現有 enum 值。與所有 enum 常值一樣,它需要用引號括起來。

property

要修改的基礎類型屬性的名稱;有關可能的值,請參閱上文。

CASCADE

自動將操作傳播到正在變更的類型的類型化表格及其後代。

RESTRICT

如果正在變更的類型是類型化表格的類型,則拒絕該操作。這是預設值。

註解

如果在交易區塊內執行 ALTER TYPE ... ADD VALUE (將新值新增到 enum 類型),則在提交交易之後才能使用新值。

涉及新增的 enum 值的比較有時會比僅涉及 enum 類型原始成員的比較慢。這通常只會在使用 BEFOREAFTER 將新值的排序位置設定在列表末尾以外的某個位置時發生。但是,有時即使將新值新增到末尾也會發生這種情況(如果 OID 計數器自 enum 類型的原始建立以來環繞 (wrapped around))。這種速度減慢通常是微不足道的;但如果很重要,可以透過捨棄並重新建立 enum 類型,或透過傾印和還原資料庫來重新獲得最佳效能。

範例

重新命名資料類型

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;

將新值新增到特定排序位置的 enum 類型

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

重新命名 enum 值

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

提交更正

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