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
(有關這些含義的更多資訊,請參閱 第 66.2 節)。但是,從 plain
更改為其他設定需要超級使用者許可權(因為它要求型別的 C 函式都已準備好 TOAST),而從其他設定更改為 plain
是完全不允許的(因為該型別可能已在資料庫中存在 TOASTed 值)。請注意,更改此選項本身不會更改任何儲存的資料,它只是設定將用於將來建立的表列的預設 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 擴充套件。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。