CodeGym /コース /SQL SELF /テーブル作成時の制約追加: NOT NULL, UNIQUE

テーブル作成時の制約追加: NOT NULL, UNIQUE

SQL SELF
レベル 17 , レッスン 1
使用可能

データはたくさんあるけど、全部が役立つわけじゃない。テーブルがゴミ箱にならないように、PostgreSQLでは制約を設定できるんだ。これは「名前」フィールドに数字を入れたり、空欄のままにしたりしないようにする簡単なルールみたいなもの。

constraintsって何?

制約(constraints)はPostgreSQLの中で、軍隊のルールみたいなもの。もしルールがなかったら、誰でも好き勝手できちゃう:ユーザーの年齢を-999にしたり、名前を空文字で入れたり、同じ学生を違うidで2回登録したり。そうならないように、PostgreSQLは制約というコントロールの仕組みを用意してる。

制約を使うと:

  1. データがちゃんと正しく、一貫性を保てる。
  2. データが決まったルールに合ってるか確認できる(例えば年齢がマイナスにならないとか)。
  3. データが期待通りじゃない時に、エラーを見つけやすくなる。

今日はよく使う2つの制約、NOT NULLUNIQUEを見ていくよ。

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    -- 担当科目(必須)
);

この例だと、namesubjectカラムは空欄にできない。もしこれらの値を指定せずに行を挿入しようとすると、エラーになるよ。

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_idcourse_idのペアはユニークじゃないとダメ。同じ学生が同じコースに2回登録しようとしたら、PostgreSQLが止めてくれる。

制約の組み合わせ:NOT NULLUNIQUE

1つのカラムにNOT NULLUNIQUEを両方つけることもできる。例えば:

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 NULLUNIQUEを知ってるのはスキルにもなるし、将来の雇い主にもアピールできるよ。

次のレクチャーでは、カラムにデフォルト値を設定できるDEFAULT制約についてやるよ。じゃあまたね!

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION