PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# 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 TYPE`の`USING`オプションでは実際、行の古い値を使用する式を指定することができます。 つまり、変換対象の列もその他の列も参照することができます。 これにより、非常に一般的な変換を`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;

## 互換性

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

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

前のページ | ホーム | 次のページ
ALTER SEQUENCE | 上に戻る | ALTER TABLESPACE