[11/15開催: PostgreSQL Conference Japan 2019 参加受付中] 
他のバージョンの文書 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 | 7.4 | 7.3 | 7.2

ALTER TABLE

名前

ALTER TABLE -- テーブル定義の変更

概要

ALTER TABLE [ ONLY ] name [ * ]
    action [, ... ]
ALTER TABLE [ ONLY ] name [ * ]
    RENAME [ COLUMN ] column TO new_column
ALTER TABLE name
    RENAME TO new_name

ここで、actionは以下のいずれかです。

    ADD [ COLUMN ] column type [ column_constraint [ ... ] ]
    DROP [ COLUMN ] column [ RESTRICT | CASCADE ]
    ALTER [ COLUMN ] column TYPE type [ USING expression ]
    ALTER [ COLUMN ] column SET DEFAULT expression
    ALTER [ COLUMN ] column DROP DEFAULT
    ALTER [ COLUMN ] column { SET | DROP } NOT NULL
    ALTER [ COLUMN ] column SET STATISTICS integer
    ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
    ADD table_constraint
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
    CLUSTER ON index_name
    SET WITHOUT CLUSTER
    SET WITHOUT OIDS
    OWNER TO new_owner
    SET TABLESPACE tablespace_name

説明

ALTER TABLEは既存のテーブルの定義を変更します。 このコマンドには、いくつか副形式があります。

ADD COLUMN

この形式を使用すると、CREATE TABLEと同じ構文を使って新しい列をテーブルに追加できます。

DROP COLUMN

この形式を使用すると、テーブルから列を削除できます。 削除する列を含んでいるインデックスおよびテーブル制約も自動的に削除されます。 また、削除する列にテーブル外のもの (例えば、外部キー制約、ビュー、など) が依存している場合、CASCADEを付ける必要があります。

ALTER COLUMN TYPE

この形式を使用すると、テーブルの列の型を変更できます。 その列を含むインデックスと簡単なテーブル制約は、元々与えられた式を再解析して新しい列の型を使用するように自動的に変換されます。 省略可能なUSING句は、古い列値からどのように新しい値を計算するかを指定します。 省略された場合、デフォルトの変換は、古いデータ型から新しいデータ型への代入時のキャストと同じです。 古いデータ型から新しいデータ型への暗黙あるいは代入時のキャストがない場合、USING句を指定しなければなりません。

SET/DROP DEFAULT

これらの形式を使用すると、列のデフォルト値を設定または削除できます。 このデフォルト値はこの変更後に行なわれるINSERTコマンドのみに適用されます。 テーブル内の既存の行は変更されません。 ビューにもデフォルトを設定可能です。 この場合、ビューのON INSERTルールが適用される前に、ビューのINSERT文にデフォルトが挿入されます。

SET/DROP NOT NULL

これらの形式を使用すると、列で NULL 値を使用できるかどうか設定できます。 SET NOT NULLは、そのテーブルの列にNULL値がひとつもない場合にのみ設定可能です。

SET STATISTICS

この形式を使用すると、コマンド実行後に行なわれるANALYZE操作において、列単位での統計情報収集対象を設定できます。 対象は、0から1000までの範囲で設定可能です。 また、対象を-1に設定すると、システムのデフォルト統計情報対象(default_statistics_target)が使用されます。 PostgreSQLの問い合わせプランナによる統計情報の使用に関する詳細は、項13.2を参照してください。

SET STORAGE

この形式を使用すると、列の保管モードを設定します。 これにより、この列をインラインで保持するか、あるいは補足テーブルに保持するか、また、データを圧縮するかどうかを制御できます。 PLAINは、integerのような固定長の値に対して使用しなければならず、インラインで保持されていて圧縮されません。 MAINは、インラインで保持されていて、圧縮可能なデータに使用します。 EXTERNALは圧縮されていない外部データに使用します。 EXTENDEDは圧縮された外部データに使用します。 EXTENDEDは、PLAIN以外の保管をサポートするほとんどのデータ型でのデフォルトです。 EXTERNALを使用すると、textおよびbytea列に対する部分文字列操作をより速く処理できますが、保管容量が増えるというデメリットがあります。 SET STORAGEそのものはテーブルを全く変更しないことに注意してください。 これは単に将来のテーブルの更新時に遂行される戦略を設定するだけです。 詳細は項49.2を参照してください。

ADD table_constraint

この形式を使用すると、CREATE TABLEと同じ構文を使って新しい制約をテーブルに追加できます。

DROP CONSTRAINT

この形式を使用すると、テーブルの制約を削除できます。 現在、テーブルの制約は、一意な名前である必要はありません。 従って、指定した名前に一致する制約が、複数存在する可能性があります。 一致した制約は全て削除されます。

CLUSTER

この形式は、将来のCLUSTER操作用のデフォルトインデックスを選択します。 実際のテーブルの再クラスタ化は行ないません。

SET WITHOUT CLUSTER

この形式は、テーブルから最も最近に使用されたCLUSTERインデックス指定を削除します。 これは、今後のインデックスを指定しないクラスタ操作に影響を与えます。

SET WITHOUT OIDS

この形式は、テーブルからoidシステム列を削除します。 これは、既にoid列が存在しない場合であっても警告が現れないという点を除いて、DROP COLUMN oid RESTRICTと全く同じです。

OIDを削除した後にOIDを再度テーブルに保存させるALTER TABLEの変種は存在しないことに注意してください。

OWNER

この形式を使用すると、テーブル、インデックス、シーケンス、またはビューの所有者を、指定したユーザに変更できます。

SET TABLESPACE

この形式を使用すると、テーブルのテーブル空間を指定したテーブル空間に変更し、テーブルに関連するデータファイルを新しいテーブル空間に移動することができます。 テーブルにインデックスがあったとしても移動されません。 これらは別途SET TABLESPACEコマンドを実行することで移動することができます。 CREATE TABLESPACEも参照してください。

RENAME

RENAME 形式を使用すると、テーブル (もしくは、インデックス、シーケンス、またはビュー) の名前や、テーブルの個々の列名を変更できます。 格納されているデータへの影響はありません。

RENAME以外の全ての操作は、組み合わせて複数の変更操作のリストとすることができ、それらは並行に適用されます。 例えば、複数の列を追加することも、複数列の型を変更することも、そしてこの追加と変更を単一のコマンドで実行することができます。 これは特に巨大なテーブルでは便利です。変更のために必要なテーブル全体の走査が1回で済むからです。

ALTER TABLEコマンドを使用するには、変更するテーブルを所有している必要があります。 ただし、ALTER TABLE OWNERコマンドは例外です。 このコマンドは、スーパーユーザのみ実行可能です。

パラメータ

name

変更対象となる既存のテーブルの名前です (スキーマ修飾名も可)。 ONLYが指定された場合、そのテーブルのみが変更されます。 ONLYが指定されていない場合、そのテーブルおよび (存在する場合は) それを継承する全てのテーブルが更新されます。 テーブル名に *を付けることで継承テーブルが変更されることを表すことができますが、現在のバージョンでは、これはデフォルトで行われます。 (7.1より前のリリースでは、ONLY がデフォルトでした。 このデフォルトの設定は、sql_inheritance設定オプションで変更できます。)

column

新規または既存の列の名前です。

new_column

既存の列の新しい名前です。

new_name

テーブルの新しい名前です。

type

新しい列のデータ型、もしくは、既存の列に対する新しいデータ型です。

table_constraint

テーブルの新しいテーブル制約です。

constraint_name

削除する既存の制約の名前です。

CASCADE

削除された列や制約に依存しているオブジェクト (たとえば、削除された列を参照しているビューなど) を、自動的に削除します。

RESTRICT

依存しているオブジェクトがある場合、列または制約の削除要求を拒否します。 これがデフォルトの動作です。

index_name

指定したインデックス名でテーブルをクラスタ化するように印をつけます。

new_owner

テーブルの新しい所有者のユーザ名です。

tablespace_name

テーブルを移動する先のテーブル空間の名前です。

注釈

COLUMNキーワードはノイズであり、省略可能です。

ADD COLUMNによって列が追加される時、テーブル内の全ての既存行は、その列のデフォルト値(DEFAULTが指定されなかった場合はNULL)で初期化されます。

非NULLのデフォルト値を持つ列を追加する、あるいは、既存の列の型を変更することは、テーブル全体を書き換えることが必要になります。 巨大なテーブルでは非常に時間がかかる可能性があり、また、一時的に2倍のディスク容量が必要とされます。

CHECKあるいはNOT NULL制約を追加することは、既存の行が制約に従うかどうかを検証するためのテーブルの走査が必要になります。

単一のALTER TABLE内に複数の変更を指定できるオプションを提供する主な理由は、複数のテーブル走査や書き換えを1回のテーブル走査にまとめることができるようにすることです。

DROP COLUMN形式は、物理的には列を削除せずに、単にSQLを操作する上で不可視にします。 コマンド実行後、そのテーブルに挿入または更新が行なわれると、その列にNULLが格納されます。 従って、列の削除は短時間で行えます。 しかし、削除された列が占めていた領域がまだ回収されていないため、テーブルのディスク上のサイズはすぐには小さくなりません。 その領域は、その後既存の行が更新されると、回収されます。

ALTER TYPEがテーブル全体の書き換えを必要とすることは利点となる場合があります。 この書き換え処理によって、テーブル内の不要となった領域を除去されるからです。 例えば、削除された列によって占有されていた領域を即座に回収するには、以下のコマンドが最も高速です。

ALTER TABLE table ALTER COLUMN anycol TYPE anytype;

ここで、anycolは既存のテーブル列を、anytypeは既存の列と同一の型を示します。 この結果、テーブルには目に見えるような有意な変更はありませんが、このコマンドは不要となったデータを取り除く、強制的な書き換えを行ないます。

ALTER TYPEUSINGオプションでは実際、行の古い値を使用する式を指定することができます。 つまり、変換対象の列もその他の列も参照することができます。 これにより、非常に一般的な変換をALTER TYPE構文で行うことができます。 この柔軟性のため、USING式は(あったとしても)列のデフォルト値には適用できません。 この結果は、デフォルトで要求される定数式にならない可能性があるためです。 これは、古い型から新しい型への暗黙キャストや代入キャストが存在しない場合、USINGが指定されていたとしても、ALTER TYPEがデフォルトの変換に失敗する可能性があることを意味します。 こうした場合、DROP DEFAULTでデフォルトを削除し、ALTER TYPEを行い、そして、SET DEFAULTを使用して適切な新しいデフォルトを付けてください。 同様の検討はその列を持つインデックスと制約にも適用されます。

テーブルに、そのテーブルを継承するテーブルがある場合、継承しているテーブルに同じ処理を実行しなければ、親テーブルに列を追加、もしくは列名の変更、列型の変更を実行することはできません。 つまり、ALTER TABLE ONLYコマンドは受け付けられません。 この制限により、継承しているテーブルでは、常に親テーブルと列が一致していることが保証されます。

再帰的なDROP COLUMN操作では、継承テーブルが他の親テーブルからその列を継承しておらず、かつ、独立した列定義を持っていない場合にのみ、その継承テーブルの列を削除します。 再帰的でないDROP COLUMN(例えば、ALTER TABLE ONLY ... DROP COLUMNなど) では、継承している列は削除しません。 しかし、削除する代わりに、これらの列は継承されておらず独立して定義されているという印を付けます。

システムカタログテーブルのいかなる部分も変更することは許可されていません。

有効なパラメータの詳しい説明はCREATE TABLEを参照してください。 第5章に、継承に関する更に詳しい情報があります。

varchar 型の列をテーブルに追加します。

ALTER TABLE distributors ADD COLUMN address varchar(30);

テーブルから列を削除します。

ALTER TABLE distributors DROP COLUMN address RESTRICT;

1つの操作で既存の2列の型を変更します。

ALTER TABLE distributors
    ALTER COLUMN address TYPE varchar(80),
    ALTER COLUMN name TYPE varchar(100);

USING句を使用して、UNIXタイムスタンプを持つinteger型の列をtimestamp with time zoneに変更します。

ALTER TABLE foo
    ALTER COLUMN foo_timestamp TYPE timestamp with time zone
    USING
        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';

既存の列の名前を変更します。

ALTER TABLE distributors RENAME COLUMN address TO city;

既存のテーブルの名前を変更します。

ALTER TABLE distributors RENAME TO suppliers;

列に非NULL制約を付与します。

ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;

列から非NULL制約を削除します。

ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;

テーブルにCHECK制約を付与します。

ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);

テーブルとその子テーブルからCHECK制約を削除します。

ALTER TABLE distributors DROP CONSTRAINT zipchk;

テーブルに外部キー制約を付与します。

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) MATCH FULL;

テーブルに(複数列の)一意性制約を付与します。

ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);

自動的に命名されるプライマリキー制約をテーブルに付与します。 テーブルは1つのみのプライマリキーしか持つことができない点には注意して下さい。

ALTER TABLE distributors ADD PRIMARY KEY (dist_id);

テーブルを別のテーブル空間に移動します。

ALTER TABLE distributors SET TABLESPACE fasttablespace;

互換性

ADDDROPSET DEFAULT形式は標準SQLに従います。 他の形式は標準SQLに対するPostgreSQLの拡張です。 また、単一のALTER TABLEコマンド内に複数の操作を指定する機能も拡張です。

ALTER TABLE DROP COLUMNを使用して、テーブルから列のみを削除して、列が無いテーブルを作成することができます。 これは、列が無いテーブルを許可しないSQLからの拡張です。