制約の使い方

入れてよい値を決める

書き方

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 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。

SQL 構文一覧(使い方と例)へ戻る