データはたくさんあるけど、全部が役立つわけじゃない。テーブルがゴミ箱にならないように、PostgreSQLでは制約を設定できるんだ。これは「名前」フィールドに数字を入れたり、空欄のままにしたりしないようにする簡単なルールみたいなもの。
constraintsって何?
制約(constraints)はPostgreSQLの中で、軍隊のルールみたいなもの。もしルールがなかったら、誰でも好き勝手できちゃう:ユーザーの年齢を-999にしたり、名前を空文字で入れたり、同じ学生を違うidで2回登録したり。そうならないように、PostgreSQLは制約というコントロールの仕組みを用意してる。
制約を使うと:
- データがちゃんと正しく、一貫性を保てる。
- データが決まったルールに合ってるか確認できる(例えば年齢がマイナスにならないとか)。
- データが期待通りじゃない時に、エラーを見つけやすくなる。
今日はよく使う2つの制約、NOT NULLとUNIQUEを見ていくよ。
NOT NULL制約
NOT NULL制約はPostgreSQLに「ねぇ、このフィールドは絶対に値が必要だよ。不明とかダメだからね!」って伝えるもの。もしNULLを含む行をテーブルに追加しようとすると、PostgreSQLはエラーを返す。特に名前や生年月日みたいな必須フィールドに便利。
NOT NULLの使い方例
CREATE TABLE teachers (
id SERIAL PRIMARY KEY, -- ユニークなID
name VARCHAR(100) NOT NULL, -- 教員の名前(必須)
subject VARCHAR(50) NOT NULL -- 担当科目(必須)
);
この例だと、nameとsubjectカラムは空欄にできない。もしこれらの値を指定せずに行を挿入しようとすると、エラーになるよ。
INSERT INTO teachers (name, subject)
VALUES (NULL, 'Mathematics');
結果:エラー!教員の名前が指定されてないけど、nameは値が必要なんだ。
UNIQUE制約:ユニークさが必要
UNIQUE制約は、カラムやカラムの組み合わせの値が重複しないことを保証する。例えば、2人の学生が同じ学生番号を持たないようにしたい時に便利。
NOT NULLが「全員ちゃんと服着てきてね」なら、UNIQUEは「パーティーで同じドレスは禁止!」みたいな感じ。
UNIQUEの使い方例
CREATE TABLE departments (
id SERIAL PRIMARY KEY, -- ユニークなID
name VARCHAR(100) UNIQUE -- 学科名はユニークじゃないとダメ
);
これで同じ名前の学科を2つ追加できなくなる。
INSERT INTO departments (name) VALUES ('Mathematics');
INSERT INTO departments (name) VALUES ('Mathematics');
結果:エラー! nameカラムに重複した値を入れようとしたから。
複合UNIQUE制約
2つ以上のカラムの組み合わせでユニークにすることもできる。例えば:
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY, -- レコードのユニークID
student_id INTEGER NOT NULL, -- 学生ID
course_id INTEGER NOT NULL, -- コースID
UNIQUE (student_id, course_id) -- 同じ学生が同じコースに2回登録できない
);
これでstudent_idとcourse_idのペアはユニークじゃないとダメ。同じ学生が同じコースに2回登録しようとしたら、PostgreSQLが止めてくれる。
制約の組み合わせ:NOT NULLとUNIQUE
1つのカラムにNOT NULLとUNIQUEを両方つけることもできる。例えば:
CREATE TABLE users (
username VARCHAR(50) NOT NULL UNIQUE, -- ユーザー名は必須&ユニーク
email VARCHAR(100) NOT NULL UNIQUE -- メールアドレスも必須&ユニーク
);
ここではユーザー名もメールアドレスも、空欄にできないし、重複もダメ。
制約でよくあるミス
UNIQUEだけつけてNOT NULLをつけないと、NULLの空欄を何回も入れられちゃう。PostgreSQLはNULL同士はイコールじゃないと考えるから。空欄も禁止したいならNOT NULLもつけよう。
UNIQUE制約のカラムに重複した値を入れようとするとエラーになる。INSERTする前に、入力データをちゃんとチェックしよう。
制約をつけすぎると、INSERTのパフォーマンスが落ちることもあるから注意。
なんでこんなことするの?
制約を使うと、データの重複や空欄、ヒューマンエラーによる色んな問題を防げる。データベースが「自分で自分を守る」感じになるし、大きなプロジェクトだとこれがめっちゃ時間の節約になる。面接でも制約についてよく聞かれるから、NOT NULLとUNIQUEを知ってるのはスキルにもなるし、将来の雇い主にもアピールできるよ。
次のレクチャーでは、カラムにデフォルト値を設定できるDEFAULT制約についてやるよ。じゃあまたね!
GO TO FULL VERSION