ALTER TYPE — 變更類型的定義
ALTER TYPEname
OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER TYPEname
RENAME TOnew_name
ALTER TYPEname
SET SCHEMAnew_schema
ALTER TYPEname
RENAME ATTRIBUTEattribute_name
TOnew_attribute_name
[ CASCADE | RESTRICT ] ALTER TYPEname
action
[, ... ] ALTER TYPEname
ADD VALUE [ IF NOT EXISTS ]new_enum_value
[ { BEFORE | AFTER }neighbor_enum_value
] ALTER TYPEname
RENAME VALUEexisting_enum_value
TOnew_enum_value
ALTER TYPEname
SET (property
=value
[, ... ] ) whereaction
is one of: ADD ATTRIBUTEattribute_name
data_type
[ COLLATEcollation
] [ CASCADE | RESTRICT ] DROP ATTRIBUTE [ IF EXISTS ]attribute_name
[ CASCADE | RESTRICT ] ALTER ATTRIBUTEattribute_name
[ SET DATA ] TYPEdata_type
[ COLLATEcollation
] [ 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
(有關這些含義的更多資訊,請參閱 第 65.2 節)。 但是,從 plain
變更為其他設定需要超級使用者權限(因為它要求類型的 C 函數都已準備好 TOAST),並且完全不允許從其他設定變更為 plain
(因為該類型可能已在資料庫中存在 TOASTed 值)。 請注意,變更此選項本身不會變更任何儲存的資料,它只會設定未來建立的資料表欄位要使用的預設 TOAST 策略。 請參閱 ALTER TABLE 以變更現有資料表欄位的 TOAST 策略。
有關這些類型屬性的更多詳細資訊,請參閱 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
要新增到 enum 類型的值列表中的新值,或要給予現有值的新名稱。與所有 enum 常值一樣,它需要用引號括起來。
neighbor_enum_value
現有的 enum 值,新值應緊接在其之前或之後新增到 enum 類型的排序順序中。與所有 enum 常值一樣,它需要用引號括起來。
existing_enum_value
應該重新命名的現有 enum 值。與所有 enum 常值一樣,它需要用引號括起來。
property
要修改的基礎類型屬性的名稱;有關可能的值,請參閱上文。
CASCADE
自動將操作傳播到正在變更的類型的類型化表格及其後代。
RESTRICT
如果正在變更的類型是類型化表格的類型,則拒絕該操作。這是預設值。
如果在交易區塊內執行 ALTER TYPE ... ADD VALUE
(將新值新增到 enum 類型),則在提交交易之後才能使用新值。
涉及新增的 enum 值的比較有時會比僅涉及 enum 類型原始成員的比較慢。這通常只會在使用 BEFORE
或 AFTER
將新值的排序位置設定在列表末尾以外的某個位置時發生。但是,有時即使將新值新增到末尾也會發生這種情況(如果 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 擴充功能。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格報告文件問題。