例えば、大学のデータベースを設計してるとするよ。最初はstudentsテーブルにIDと名前の2つだけ。シンプルで、学生たちもシステムを使い始める。でも1ヶ月後、先生たちが来て「年齢も追加できる?」って言ってきて、さらに「emailも必要だよね」って。で、最後には「middle_nameのカラム、誰も使ってないし消そうよ!」ってなる。こんな時にALTER TABLEでカラムの追加・削除スキルが役立つんだ。
カラム追加の構文
じゃあ、PostgreSQLの既存テーブルに新しいカラムを追加するには、ALTER TABLEコマンドを使うよ。構文はこんな感じ:
ALTER TABLE table_name
ADD COLUMN column_name data_type [constraints];
table_name— 新しいカラムを追加したいテーブル名。column_name— 追加したいカラム名。data_type— データ型。例えばVARCHAR、INTEGER、DATEとか。constraints(オプション) — このカラムに付けたい制約。例えばNOT NULL、DEFAULTなど。
例:新しいカラムを追加する
例えば、前に作ったstudentsテーブルがあるとする:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
で、学生の年齢を保存するageカラムを追加したいってなったら、こうやる:
ALTER TABLE students
ADD COLUMN age INTEGER;
これでstudentsテーブルの構造はこうなる:
| id | name | age |
|---|---|---|
| 1 | Eva | NULL |
| 2 | Alex | NULL |
新しいレコードを年齢なしで追加すると、PostgreSQLは自動的にNULLを入れるよ。だってNOT NULLやDEFAULTみたいな制約を付けてないからね。
カラム削除の構文
カラムをテーブルから削除するのもALTER TABLEコマンドでできる。構文はこれ:
ALTER TABLE table_name
DROP COLUMN column_name [RESTRICT | CASCADE];
table_name— カラムを削除したいテーブル名。column_name— 削除するカラム名。RESTRICT— 参照がある場合は削除禁止(デフォルト)。CASCADE— 依存してるものも一緒に削除。
依存関係のカスケード削除については、次のレベルで詳しく話すね :P
例:いらないカラムを削除する
またstudentsテーブルに戻るよ。今度はageカラムがもういらなくなった。削除しよう:
ALTER TABLE students
DROP COLUMN age;
これでテーブルの構造はまたシンプルに:
| id | name |
|---|---|
| 1 | Eva |
| 2 | Alex |
便利な例
制約付きでカラムを追加する
もしageカラムをNOT NULL制約とデフォルト値付きで追加したいなら、こんな感じ:
ALTER TABLE students
ADD COLUMN age INTEGER NOT NULL DEFAULT 18;
これで既存の全ての行のageカラムには18が入るし、新しいレコードを追加する時はデフォルト値を使わない限り必ず値を指定しないといけない。
依存関係があるカラムの削除
もしカラムがビューやトリガーで使われてるなど依存関係がある場合は、CASCADE修飾子が必要。でも注意してね、他のオブジェクトにも影響が出るかも。例えば:
ALTER TABLE students
DROP COLUMN email CASCADE;
よくあるミスやポイント
エラー:カラム追加時のデータ型ミス。
例えばINTEGER型でカラムを追加したのに、テキストデータを入れようとすると、PostgreSQLはエラーを返すよ。データ型は中身に合わせて選ぼう。
エラー:依存関係を考えずにカラム削除。
例えば、インデックスや外部キーが参照してるカラムを削除すると、CASCADE修飾子なしだとPostgreSQLがエラーを出す。
エラー:依存関係があるカラムの削除。 例えば、インデックスや外部キーが参照してるカラムを削除すると、CASCADE修飾子なしだとPostgreSQLがエラーを出す。CASCADEを付けて削除したら、そのカラムを参照してた何千もの行も一緒に消えちゃった…消したくなかったのに :(
ポイント:変更の順番。
制約付きでカラムを追加する時は、操作の順番に注意が必要なこともある。例えばNOT NULL付きでカラムを追加するなら、先にデフォルト値で埋めておかないとPostgreSQLがエラーを返すよ。
GO TO FULL VERSION