制約の使い方
入れてよい値を決める
書き方
PRIMARY KEY NOT NULL UNIQUE DEFAULT 値 CHECK (条件) REFERENCES 表(列) FOREIGN KEY (列) REFERENCES …
PRIMARY KEY は重複も NULL も不可。外部キーは相手の表にある値だけを許します。違反するとエラーになります。
よく使うオプション
| オプション | 意味 |
|---|---|
PRIMARY KEY | 行を見分ける列。重ならず、NULL も入れられない |
NOT NULL | 値を必ず入れる |
UNIQUE | 同じ値を入れられない(NULL はいくつでもよい) |
CHECK (条件) | 条件に合う値だけを入れられる |
REFERENCES 表(列) | 相手の表にある値だけを入れられる(外部キー) |
DEFAULT 値 | 入れなかったときの値 |
例
CREATE TABLE staff ( id INTEGER PRIMARY KEY, email VARCHAR(100) NOT NULL UNIQUE, dept_id INTEGER REFERENCES departments(id), salary INTEGER CHECK (salary >= 0) );
id は重ならず、email は必ず入れて重ならず、dept_id は部署の表にある番号だけ、給与は 0 以上、という決まりの表です。
INSERT INTO staff (id, email, salary) VALUES (1, 'a@example.com', -100);ERROR: new row for relation "staff" violates check constraint "staff_salary_check"CHECK に合わない値を入れようとしたので、エラーになって入りません。
CREATE TABLE order_items ( order_id INTEGER REFERENCES orders(id) ON DELETE CASCADE, line_no INTEGER, PRIMARY KEY (order_id, line_no) );
2 つの列の組み合わせを主キーにします。注文を消すと、その明細も一緒に消えます(ON DELETE CASCADE)。
よくある間違い・注意
- 外部キーの相手の列には、主キーか UNIQUE が要ります。
- UNIQUE の列には、NULL ならいくつでも入れられます(SQL Server は 1 つだけ)。
- 制約にぶつかった文は、まるごと取り消されます。何行かまとめて入れたときは、1 行も入りません。
実際に打って練習する
SQL コースの Lv42「守りを固める 制約」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。
Lv1〜3 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。