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
変更対象となる既存のテーブルの名前です (スキーマ修飾名の場合もあります)。 ONLY が指定された場合、そのテーブルのみが変更されます。 ONLY が指定されていない場合、そのテーブルおよび (存在する場合は) それを継承するすべてのテーブルが更新されます。 継承テーブルがスキャンされることを表すために、テーブル名に * を付けることができますが、現在のバージョンでは、継承テーブルのスキャンはデフォルトで行われます。 (7.1 より前のリリースでは、ONLY がデフォルトでした。) デフォルト設定は、SQL_INHERITANCE 設定オプションで変更できます。
新規または既存の列の名前です。
新しい列の型です。
既存の列の新しい名前です。
テーブルの新しい名前です。
テーブルの新しいテーブル制約です。
削除する既存の制約の名前です。
テーブルの新しい所有者のユーザ名です。
削除された列や制約に依存しているオブジェクト (たとえば、削除された列を参照しているビューなど) を、自動的に削除します。
依存しているオブジェクトがある場合、列または制約の削除要求を拒否します。 これがデフォルトの動作です。
ALTER TABLE は既存のテーブルの定義を変更します。 このコマンドには、いくつか従属的な形式 (サブフォーム) があります。
この形式を使用すると、CREATE TABLE と同じ構文を使って新しい列をテーブルに追加できます。
この形式を使用すると、テーブルから列を削除できます。 削除する列を含んでいるインデックスおよびテーブル制約も自動的に削除されることに注意してください。 また、削除する列にテーブル外のもの (たとえば、外部キー制約、ビュー、など) が依存している場合、CASCADE 制約を付ける必要があります。
これらの形式を使用すると、列のデフォルト値を設定または削除できます。デフォルトはこの変更後に行なわれる INSERT コマンドのみに適用されることに注意してください。 テーブル内の既存の行は変更されません。 ビューにもデフォルトを設定可能です。この場合、ビューの ON INSERT ルールが適用される前に、ビューの INSERT 文にデフォルトが挿入されます。
これらの形式を使用すると、列で NULL 値を使用できるかどうか設定できます。 SET NOT NULL は、そのテーブルの列に NULL 値がひとつもない場合にのみ設定可能です。
この形式を使用すると、コマンド実行後に行なわれる ANALYZE 操作において、列ごとの統計情報収集対象を設定できます。 対象は、0 から 1,000 までの範囲で設定可能です。また、対象を -1 に設定すると、システムのデフォルト統計情報対象が使用されます。
この形式を使用すると、列に保管モードを設定します。 これにより、この列をインラインで保持するか、あるいは補足テーブルに保持するか、また、データを圧縮するかどうかを制御できます。 PLAIN は、INTEGER のような固定長の値で、インラインで保持されていて圧縮されていないデータに使用する必要があります。 MAIN は、インラインで保持されていて、圧縮可能なデータに使用します。 EXTERNAL は圧縮されていない外部データに使用し、EXTENDED は圧縮された外部データに使用します。 EXTENDED は、これをサポートしているすべてのデータ型でのデフォルトです。 EXTERNAL を使用すると、TEXT 列に対する部分文字列操作をより速く処理できますが、保管スペースが増えるというデメリットがあります。
RENAME 形式を使用すると、テーブル (もしくは、インデックス、シーケンス、またはビュー) の名前や、テーブルの個々の列名を変更できます。 格納されているデータへの影響はありません。
この形式を使用すると、CREATE TABLE と同じ構文を使って新しい制約をテーブルに追加できます。
この形式を使用すると、テーブルの制約を削除できます。 現在、テーブルの制約は、一意な名前である必要はありません。したがって、指定した名前に一致する制約が、複数存在する可能性があります。 一致した制約はすべて削除されます。
この形式を使用すると、テーブル、インデックス、シーケンス、またはビューの所有者を、指定したユーザに変更できます。
ALTER TABLE コマンドを使用するには、変更するテーブルを所有している必要があります。ただし、ALTER TABLE OWNER コマンドは例外です。このコマンドは、スーパーユーザのみ実行可能です。
COLUMNキーワードはノイズであり、省略可能です。
現在の ADD COLUMN の実装では、新しい列のデフォルトと NOT NULL 句はサポートされません。 新しい列は、必ずすべての値が NULL 値である状態で作成されます。 後からデフォルト値を設定するには、ALTER TABLE の SET 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);