ALTER TABLE [ ONLY ] table [ * ] ADD [ COLUMN ] column type [ column_constraint [ ... ] ] ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT } ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column SET STATISTICS integer ALTER TABLE [ ONLY ] table [ * ] RENAME [ COLUMN ] column TO newcolumn ALTER TABLE table RENAME TO new_table ALTER TABLE table ADD table_constraint_definition ALTER TABLE [ ONLY ] table DROP CONSTRAINT constraint { RESTRICT | CASCADE } ALTER TABLE table OWNER TO new_owner
ALTER TABLE は既存のテーブルの定義を変更します。 ADD COLUMN 形式は CREATE TABLE と同じ構文を使って新しい列をテーブルに追加します。 ALTER COLUMN SET/DROP DEFAULT 形式を使用して、列のデフォルトを設定または解除することができます。デフォルトはこの変更後に行なわれる INSERT コマンドのみに適用されることに注意してください。テーブル内の既存の行は変更されません。 ALTER COLUMN SET STATISTICS 形式を使用して、この変更後に行なわれる ANALYZE 操作における統計情報収集対象を設定することができます。 RENAME 句を使用して対象とするテーブルに含まれるデータをまったく変更することなく、テーブル、列、インデックス、シーケンスの名前を変更することができます。そのデータは、このコマンドが実行された後でも同じ型とサイズのままです。ADD table_constraint_definition 句は、CREATE TABLE と同じ構文を使ってテーブルに新しい制約を追加します。DROP CONSTRAINT constraint 句はテーブル(およびその子テーブル)上の、 constraint に一致する制約を削除します。OWNER 句はテーブルの所有者を new userに変更します。
テーブルのスキーマを変更するためには、そのテーブルを所有していなければなりません。
COLUMNキーワードはノイズであり、省略可能です。
現在の ADD COLUMN の実装では、新しい列のデフォルトと NOT NULL 句はサポートされません。ALTER TABLE の SET DEFAULT 形式を使って後でデフォルトを設定することができます(また、既存の行を新しいデフォルト値に更新したい場合は UPDATE を使用して下さい)。
依存関係の検査はまだ行なわれませんが、DROP CONSTRAINT では、RESTRICT が必須です。CASCADE オプションはサポートされていません。現在の DROP CONSTRAINT は CHECK 制約のみを削除します。PRIMARY もしくは UNIQUE 制約を削除するには、 DROP INDEX を使用して対応するインデックスを削除して下さい。FOREIGN KEY 制約を削除するには、CREATE TABLE コマンドに異なるパラメータを指定して、テーブルを再作成し、再ロードする必要があります。
例えば、distributors テーブルの全ての制約を削除するには、以下のようにします。
CREATE TABLE temp AS SELECT * FROM distributors; DROP TABLE distributors; CREATE TABLE distributors AS SELECT * FROM temp; DROP TABLE temp;
テーブルを変更するためにはそのテーブルを所有していなければいけません。システムカタログのスキーマのいかなる部分も変更することは許可されていません。PostgreSQL ユーザガイドに、継承に関するさらに詳しい情報があります。
有効な引数の詳しい説明は CREATE TABLE を参照してください。
varchar 型の列をテーブルに追加するには、以下のようにします。
ALTER TABLE distributors ADD COLUMN address VARCHAR(30);
既存の列の名前を変えるには、以下のようにします。
ALTER TABLE distributors RENAME COLUMN address TO city;
既存のテーブルの名前を変更するには、以下のようにします。
ALTER TABLE distributors RENAME TO suppliers;
テーブルに CHECK 制約を追加するには、以下のようにします。
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
テーブルとその子テーブルから CHECK 制約を削除するには、以下のようにします。
ALTER TABLE distributors DROP CONSTRAINT zipchk RESTRICT;
外部キー制約をテーブルに追加するには、以下のようにします。
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 制約をサポートしないという例外はありますが、規則に従っています。 ALTER COLUMN 形式は完全に規則どおりです。
SQL92では、以下のような、まだ PostgreSQL に直接サポートされていない ALTER TABLE 文の追加機能が指定されています。
ALTER TABLE table DROP [ COLUMN ] column { RESTRICT | CASCADE }
テーブルから列を削除します。現在では、既存の列を削除するためには以下のように、テーブルを再作成してから再ロードしなくてはなりません。
CREATE TABLE temp AS SELECT did, city FROM distributors; DROP TABLE distributors; CREATE TABLE distributors ( did DECIMAL(3) DEFAULT 1, name VARCHAR(40) NOT NULL ); INSERT INTO distributors SELECT * FROM temp; DROP TABLE temp;
テーブル、列、インデックス、シーケンスの名前を変更する句は SQL92 からの PostgreSQL の拡張です。