ALTER TABLE

Name

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

Synopsis

ALTER TABLE [ ONLY ] table [ * ]
    ADD [ COLUMN ] column type [ column_constraint [ ... ] ]
ALTER TABLE [ ONLY ] table [ * ]
    DROP [ COLUMN ] column [ RESTRICT | CASCADE ]
ALTER TABLE [ ONLY ] table [ * ]
    ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }
ALTER TABLE [ ONLY ] table [ * ]
    ALTER [ COLUMN ] column { SET | DROP } NOT NULL
ALTER TABLE [ ONLY ] table [ * ]
    ALTER [ COLUMN ] column SET STATISTICS integer
ALTER TABLE [ ONLY ] table [ * ]
    ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER TABLE [ ONLY ] table [ * ]
    RENAME [ COLUMN ] column TO new_column
ALTER TABLE table
    RENAME TO new_table
ALTER TABLE [ ONLY ] table [ * ]
    ADD table_constraint
ALTER TABLE [ ONLY ] table [ * ]
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
ALTER TABLE table
    OWNER TO new_owner 
  

入力

table

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

column

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

type

新しい列の型です。

new_column

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

new_table

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

table_constraint

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

constraint_name

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

new_owner

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

CASCADE

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

RESTRICT

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

出力

ALTER TABLE

列名またはテーブル名が更新されたとき返されるメッセージです。

ERROR

テーブルまたは列が有効でない場合に返されるメッセージです。

説明

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 から 1,000 までの範囲で設定可能です。また、対象を -1 に設定すると、システムのデフォルト統計情報対象が使用されます。

SET STORAGE

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

RENAME

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

ADD table_constraint

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

DROP CONSTRAINT

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

OWNER

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

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

注釈

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;
    

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

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

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

有効な引数の詳しい説明は CREATE TABLE を参照してください。PostgreSQL ユーザガイドに、継承に関するさらに詳しい情報があります。

使用方法

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;
   

NOT NULL 制約を列に追加するには、以下のようにします。

ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
   

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

互換性

SQL92

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

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