ALTER TABLE

名前

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

概要

ALTER TABLE [ ONLY ] name [ * ]
    ADD [ COLUMN ] column type [ column_constraint [ ... ] ]
ALTER TABLE [ ONLY ] name [ * ]
    DROP [ COLUMN ] column [ RESTRICT | CASCADE ]
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] column { SET DEFAULT expression | DROP DEFAULT }
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] column { SET | DROP } NOT NULL
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] column SET STATISTICS integer
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER TABLE [ ONLY ] name [ * ]
    SET WITHOUT OIDS
ALTER TABLE [ ONLY ] name [ * ]
    RENAME [ COLUMN ] column TO new_column
ALTER TABLE name
    RENAME TO new_name
ALTER TABLE [ ONLY ] name [ * ]
    ADD table_constraint
ALTER TABLE [ ONLY ] name [ * ]
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
ALTER TABLE name
    OWNER TO new_owner
ALTER TABLE name
    CLUSTER ON index_name

説明

ALTER TABLE は既存のテーブルの定義を変更します。 このコマンドには、いくつか従属的な形式 (サブフォーム) があります。

ADD COLUMN

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

DROP COLUMN

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

SET/DROP DEFAULT

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

SET/DROP NOT NULL

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

SET STATISTICS

この形式を使用すると、コマンド実行後に行なわれる ANALYZE 操作において、列単位での統計情報収集対象を設定できます。 対象は、0 から 1000 までの範囲で設定可能です。 また、対象を -1 に設定すると、システムのデフォルト統計情報対象が使用されます。

SET STORAGE

この形式を使用すると、列の保管モードを設定します。 これにより、この列をインラインで保持するか、あるいは補足テーブルに保持するか、また、データを圧縮するかどうかを制御できます。 PLAIN は、integer のような固定長の値に対して使用しなければならず、インラインで保持されていて圧縮されません。 MAIN は、インラインで保持されていて、圧縮可能なデータに使用します。 EXTERNAL は圧縮されていない外部データに使用します。 EXTENDED は圧縮された外部データに使用します。 EXTENDED は、これをサポートしているすべてのデータ型でのデフォルトです。 EXTERNAL を使用すると、例えば、text 列に対する部分文字列操作をより速く処理できますが、保管容量が増えるというデメリットがあります。

SET WITHOUT OIDS

この形式は、テーブルからoid列を削除します。 テーブルからのOIDの削除は即座には行われません。 行が更新された時にOID用の領域は回収されます。 行が更新されないと、値とOIDの両方の領域がずっと残ります。 これは、意味的には、DROP COLUMN処理に似ています。

RENAME

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

ADD table_constraint

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

DROP CONSTRAINT

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

OWNER

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

CLUSTER

この形式を使用すると、将来のCLUSTER操作用の印を付与できます。

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

パラメータ

name

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

column

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

type

新しい列の型です。

new_column

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

new_name

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

table_constraint

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

constraint_name

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

new_owner

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

index_name

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

CASCADE

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

RESTRICT

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

注釈

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

現在の ADD COLUMN の実装では、新しい列のデフォルトと NOT NULL 句はサポートされません。 新しい列は、必ずすべての値が NULL 値となる状態で作成されます。 後からデフォルト値を設定するには、ALTER TABLESET DEFAULT 形式を使用してください。 (また、すでに存在している行を新しいデフォルト値に更新する場合は、UPDATE を使用してください。) 列に NULL 値を許さないように設定する場合は、すべての行の列に非 NULL 値を入力した後、SET NOT NULL 形式を使用してください。

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

UPDATE table SET col = col;
VACUUM FULL table;

テーブルに、そのテーブルを継承するテーブルがある場合、継承しているテーブルに同じ処理を実行しなければ、親テーブルに列を追加、もしくは 列名の変更を実行することは許可されません。 つまり、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;

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

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);

互換性

ADD COLUMN 形式は、上述のようにデフォルトと NOT NULL 制約をサポートしないという例外はありますが、標準SQLに従っています。 ALTER COLUMN 形式は完全に準拠しています。

テーブル、列、インデックス、ビュー、シーケンスの名前を変更する句は標準 SQL からの PostgreSQL の拡張です。

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