テーブルの作成後に間違いに気付いたり、あるいはアプリケーションの要件が変わったりした場合には、テーブルをいったんドロップして再度作成することができます。 しかし、テーブルにデータを入力済みの場合、あるいはそのテーブルが他のデータベースオブジェクト (たとえば外部キー制約)によって参照されている場合、これは良い方法ではありません。 そのため、PostgreSQL では既存のテーブルに変更を加えるための一連のコマンドが用意されています。
次のことができます。
列の追加
列の削除
制約の追加
制約の削除
デフォルト値の変更
列名の変更
テーブル名の変更
これらの操作はすべてALTER TABLEコマンドを使用して行うことができます。
列を追加するには、次のコマンドを使用します。
ALTER TABLE products ADD COLUMN description text;
新しい列の、テーブルの既存の行の部分にはNULL値が入ります。
次の構文を使用すると、列の制約も同時に定義することができます。
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
新しい列は最初にNULL値を持ちますので、非NULL制約を持たせることはできません。 しかし、後で非NULL制約を追加することができます。 また、新しい列にデフォルト値を定義することもできません。 標準SQLでは、既存の行中の新しい列にはデフォルト値が入ることになっていますが、この規則はまだ実装されていません。 しかし、列のデフォルトは後で調整することができます。
制約を追加するには、テーブル制約の構文が使用されます。 例を示します。
ALTER TABLE products ADD CHECK (name <> ''); ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no); ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
テーブル制約として記述できない非NULL制約を追加するには、次の構文を使用します。
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
制約は即座に検査されますので、制約を追加する前にテーブル内のデータがこれに従っている必要があります。
制約を削除するには、その制約名を知る必要があります。 自分で名前を付けた場合は簡単です。 しかし、自分で名前を付けていない場合はシステム生成の名前が割り当てられているので、それを探さなくてはなりません。 それにはpsqlの\d tablenameコマンドを使用すると便利です。 他のインタフェースにもテーブルの詳細を調べる方法があるかもしれません。 コマンドは以下のとおりです。
ALTER TABLE products DROP CONSTRAINT some_name;
(自動生成された$2といった制約名を扱う場合は、有効な識別子となるように二重引用符で括る必要があることを忘れないでください。)
これは、非NULL制約以外のすべての制約型に適用できます。 非NULL制約をドロップするには、次のようにします。
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
(非NULL制約には名前がないことを想起してください。)
列に新しいデフォルトを設定するには、以下のようなコマンドを使用します。
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
デフォルト値を削除するには常に次のようにします。
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
これは、少なくともPostgreSQLでは、デフォルトをNULLに設定することと同等です。 そのため、定義されていないデフォルト値を削除してもエラーにはなりません。 なぜなら NULL値が暗黙的にデフォルトとなっているからです。