2.6. テーブルの変更

テーブルの作成後に間違いに気付いたり、あるいはアプリケーションの要件が変わったりした場合には、テーブルをいったんドロップして再度作成することができます。 しかし、テーブルにデータを入力済みの場合、あるいはそのテーブルが他のデータベースオブジェクト (たとえば外部キー制約) によって参照されている場合、これは良い方法ではありません。 そのため、PostgreSQL では既存のテーブルに変更を加えるための一連のコマンドが用意されています。

次のことができます。

これらのアクションはすべて ALTER TABLE コマンドを使用して行うことができます。

2.6.1. 列の追加

列を追加するには、次のコマンドを使用します。

ALTER TABLE products ADD COLUMN description text;

新しい列の、テーブルの既存の行の部分には NULL 値が入ります。

次の構文を使用すると、列の制約も同時に定義することができます。

ALTER TABLE products ADD COLUMN description text CHECK (description <> '');

新しい列には最初から NULL 値が含まれているので、NOT-NULL 制約を定義することはできません。 しかし、後で NOT-NULL 制約を追加することができます。 また、新しい列にデフォルト値を定義することもできません。 SQL 標準では、既存の行中の新しい列にはデフォルト値が入ることになっていますが、この規則はまだ実装されていません。 しかし、列のデフォルトは後で調整することができます。

2.6.2. 列の削除

列を削除するには、次のコマンドを使用します。

ALTER TABLE products DROP COLUMN description;

2.6.3. 制約の追加

制約を追加するには、テーブル制約の構文が使用されます。例を示します。

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;

テーブル制約として記述できない NOT-NULL 制約を追加するには、次の構文を使用します。

ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

制約は即座に検査されるので、制約を追加する前にテーブル内のデータがこれに従っている必要があります。

2.6.4. 制約の削除

制約を削除するには、その制約の名前を知る必要があります。 自分で名前を付けた場合は簡単です。 しかし、自分で名前を付けていない場合はシステム生成の名前が割り当てられているので、それを探さなくてななりません。 それには psql command \d tablename を使用すると便利です。他のインタフェースにもテーブルの詳細を調べる方法があるかも知れません。 コマンドは以下のとおりです。

ALTER TABLE products DROP CONSTRAINT some_name;

これは、NOT-NULL 制約以外のすべての制約型に適用できます。 NOT-NULL 制約をドロップするには、次のようにします。

ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

(NOT-NULL 制約には名前がないことを想起してください。)

2.6.5. デフォルトの変更

列に新しいデフォルトを設定するには、以下のようなコマンドを使用します。

ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;

デフォルト値を削除するには常に次のようにします。

ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

これはデフォルトを NULL に設定することと同等です (少なくとも PostgreSQL では)。 そのため、定義されていないデフォルト値をドロップしてもエラーにはなりません。なぜなら NULL 値が暗黙的にデフォルトとなっているからです。

2.6.6. 列名の変更

列名を変更するには、次のようにします。

ALTER TABLE products RENAME COLUMN product_no TO product_number;

2.6.7. テーブル名の変更

テーブル名を変更するには、次のようにします。

ALTER TABLE products RENAME TO items;