ALTER TABLE [ ONLY ] table [ * ] ADD [ COLUMN ] column type ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT } ALTER TABLE table [ * ] RENAME [ COLUMN ] column TO newcolumn ALTER TABLE table RENAME TO newtable ALTER TABLE table ADD table constraint definition ALTER TABLE table OWNER TO new owner
ALTER TABLE は既存のテーブルの定義を変更します。 ADD COLUMN フォームは CREATE TABLE と同じ構文を使って新しい列をテーブルに 追加します。ALTER COLUMN フォームは 列のデフォルトを設定または解除することを許可します。デフォルトは新しく 挿入された行にのみ適用されることに注意してください。 RENAME 句は当該表に含まれるいかなるデータをも変更する ことなく、 表もしくは列の名前の変更を引き起こします。 したがって、その テーブルまたは列は、このコマンドが実行された後、同じ型とサイズで存続します。 ADD table constraint definition 句は CREATE TABLE と同じ構文を使ってテーブルに新しい制約を追加します。OWNER 句は テーブルの所有者を new user に変えます。
表のスキーマを変更するためには、その表を所有していなければなりません。
COLUMN キーワードはノイズであり、省略可能です。
現在の実装では、新しいカラムのデフォルトと制約句は無視されます。 ALTER TABLE の SET DEFAULT フォームを使って後でデフォルトを設定することができます。 (UPDATEを使って 既存の行も新しいデフォルト値に更新しなければなりません。
現在の実装では、FOREIGN KEY 制約のみがテーブルに追加されることが できます。一意な制約を作成または削除するためには一意なインデックス を作成します。(CREATE INDEX を見て下さい。)チェック制約 を追加するには、CREATE TABLEコマンドの別のパラメータを使って テーブルを再作成しリロードする必要があります。
テーブルを変更するためにはその所有権を持っていなければ なりません。システムカタログのスキーマはどの部分をリネーム することも認められていません。 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;
下記は外部キー制約をテーブルに追加します。
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address) MATCH FULL
ADD COLUMN フォームは、上記で説明された ようにデフォルトと制約をサポートしないという例外はありますが 規則に従っています。ALTER COLUMN フォームは 完全にルール通りです。
SQL92 は、まだ Postgres に直接サポートされていない ALTER TABLE 文にいくつかの機能追加を指定しています。
ALTER TABLE table DROP CONSTRAINT constraint { RESTRICT | CASCADE }
テーブル制約を削除します(チェック制約、ユニーク制約、もしくは 外部キー制約など)。ユニーク制約を削除するためには、ユニーク インデックスを削除します。他の種類の制約を削除するには、 CREATE TABLE コマンドの別のパラメータを使ってテーブルを再作成しリロード する必要があります。
例えば、テーブル distributors の 制約を削除するためには下記のようにします。
CREATE TABLE temp AS SELECT * FROM distributors; DROP TABLE distributors; CREATE TABLE distributors AS SELECT * FROM temp; DROP TABLE temp;
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 からの Postgres 拡張です。