ALTER TYPE — 型定義を変更する
ALTER TYPEname
action
[, ... ] ALTER TYPEname
OWNER TO {new_owner
| CURRENT_USER | SESSION_USER } ALTER TYPEname
RENAME ATTRIBUTEattribute_name
TOnew_attribute_name
[ CASCADE | RESTRICT ] ALTER TYPEname
RENAME TOnew_name
ALTER TYPEname
SET SCHEMAnew_schema
ALTER TYPEname
ADD VALUE [ IF NOT EXISTS ]new_enum_value
[ { BEFORE | AFTER }neighbor_enum_value
] ALTER TYPEname
RENAME VALUEexisting_enum_value
TOnew_enum_value
ここでaction
は以下のいずれかです。 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
は既存の型の定義を変更します。
複数の副構文があります。
ADD ATTRIBUTE
この構文は、CREATE TYPEと同じ構文を用いて、複合型に新しい属性を追加します。
DROP ATTRIBUTE [ IF EXISTS ]
この構文は複合型から属性を削除します。
IF EXISTS
が指定された時はその属性が存在しなくてもエラーにはなりません。
この場合は代わりに注意が発せられます。
SET DATA TYPE
この構文は複合型の属性の型を変更します。
OWNER
この構文は型の所有者を変更します。
RENAME
この構文は型の名前または複合型の個々の属性の名前を変更します。
SET SCHEMA
この構文は型を他のスキーマに移動します。
ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]
この構文は列挙型に新しい値を追加します。
列挙型の順序中での新しい値の場所は、既存の値のBEFORE
またはAFTER
という形式で指定することができます。
指定がなければ新しい項目は値のリストの最後に追加されます。
IF NOT EXISTS
が指定されている場合、型の中に新しい値が既に含まれていたとしてもエラーになりません。
注意が発生されますが、他の動作は行われません。
そうでなければ、新しい値がすでに存在しているとエラーが起こります。
RENAME VALUE
この構文では列挙型の値の名前を変更します。 列挙型の順序における値の位置は変更されません。 指定の値が存在しない、あるいは新しい名前が既に存在する場合はエラーが発生します。
ADD ATTRIBUTE
、DROP ATTRIBUTE
、ALTER ATTRIBUTE
操作は複数の変更リストにまとめて、並行して適用することができます。
例えば、複数の属性の追加、複数の属性の変更、またはその両方を1つのコマンドで実行することができます。
ALTER TYPE
を使用するには型の所有者でなければなりません。
型のスキーマを変更するには、新しいスキーマにおけるCREATE
権限も必要です。
所有者を変更するには、直接または間接的に新しい所有者ロールのメンバでなければなりません。
また、そのロールが型のスキーマにおいて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
名前の変更の対象となる既存の列挙型の値です。 すべての列挙型のリテラルと同様、引用符を付ける必要があります。
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';
属性の追加および削除を行う構文は標準SQLの一部です。 他の構文はPostgreSQLの拡張です。