基本情報技術者試験 (FE) 科目 A — データベース

CREATE TABLE と 4 つの制約

定義

制約は表に入る値が満たすべき条件を宣言しておく仕組み。一意性制約は重複を、参照制約は存在しない親への参照を、検査制約は条件を満たさない値を、非NULL制約は NULL を、それぞれ拒否する。

CREATE TABLE で表の構造を決める

表を作る命令が CREATE TABLE です。 表やビューの構造を定義するこうした命令をDDL(データ定義言語)、 中身を読み書きする命令をDML(データ操作言語)と呼びます。

CREATE TABLE 在庫 (
  商品番号 CHAR(4) NOT NULL,
  倉庫     CHAR(2) NOT NULL,
  在庫数   INT CHECK (在庫数 >= 0),
  PRIMARY KEY (商品番号, 倉庫),
  FOREIGN KEY (商品番号) REFERENCES 商品(商品番号)
)

試す: 作った表に INSERT してから SELECT で確かめる

リセットで表の中身も元に戻ります
エディタを読み込み中…

4 つの制約

制約は「この表に入ってよい値の条件」を宣言しておく仕組みです。 違反する操作は実行時に拒否されます。

制約書き方拒否するもの
一意性制約PRIMARY KEY / UNIQUE重複する値
参照制約FOREIGN KEY ... REFERENCES参照先に存在しない値
検査制約CHECK (条件)条件を満たさない値
非NULL制約NOT NULLNULL

主キーと UNIQUE の違い

  • 主キーは NULL を許さないが、UNIQUE は許す
  • UNIQUE では NULL どうしは重複と見なされない(何個でも入る)
  • 主キーは 1 表に 1 つだけ、UNIQUE は複数付けられる

なお、複数の列をまとめて主キーにすることもできます (上の例の PRIMARY KEY (商品番号, 倉庫))。 この場合は組み合わせが重複しなければよいので、 商品番号が同じ行が複数あっても倉庫が違えば入ります。

試す: 商品番号 を P01 に変えると主キーの重複で弾かれる

リセットで表の中身も元に戻ります
エディタを読み込み中…

参照制約は「両方向」に効く

参照制約はよく「子に変な値を入れさせない」と説明されますが、親を消せなくする効果もあります。

  • 子に、親に存在しない値を INSERT できない
  • 子から参照されている親の行を DELETE できない
  • 子から参照されている親のキーを UPDATE できない

制約が「なぜ必要なのか」は参照整合性の解説で扱っています。

ブラウザで壊してみる

下の SQL は参照制約に違反する INSERT です。 実行すると、どの制約に違反したかと、表のどの行が問題なのかが表示されます。

次の SQL も試してみてください(表はリセットで元に戻ります)。

  • INSERT INTO 商品 VALUES ('P01', '重複', 'A', 1) — 主キーの重複
  • INSERT INTO 商品 VALUES ('P06', NULL, 'A', 1) — 非NULL制約
  • DELETE FROM 商品 WHERE 商品番号 = 'P01' — 子から参照されている親

試す: 上の 3 つの SQL に書き換えて、それぞれどの制約で弾かれるか見る

リセットで表の中身も元に戻ります
エディタを読み込み中…

試験で問われるポイント

  • 主キーと UNIQUE の違い(NULL を許すかどうか)
  • 参照制約が親の DELETE / UPDATE も止めること
  • 複合主キーで「重複」と見なされる条件
  • DDL と DML の分類(どの命令がどちらか)

よくある疑問

Q.主キーと一意性制約 (UNIQUE) は何が違いますか?
A.どちらも重複を許しませんが、主キーは NULL も許しません。UNIQUE は NULL を許し、NULL どうしは重複と見なされません。また主キーは 1 つの表に 1 つだけですが、UNIQUE は複数付けられます。
Q.参照制約があると、親の行はいつ消せなくなりますか?
A.その行を参照している子の行が 1 つでも残っている間は消せません。先に子を消すか、参照を別の行に付け替える必要があります。子を残したまま親を消そうとすると参照制約違反になります。
Q.DDL と DML の違いは何ですか?
A.DDL はデータ定義言語で、表やビューといった入れ物の構造を定義します (CREATE / DROP / ALTER)。DML はデータ操作言語で、入れ物の中身を読み書きします (SELECT / INSERT / UPDATE / DELETE)。

自由に試す / 他のレッスンを読む

データベース分野をもっと学ぶ(おすすめ書籍)

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

プログラムの読み方でつまずいたら。

たいてっくが、アルゴリズムの追い方から SQL・データベース設計まで、1対1で学習をサポートします。「コードを目で追っても何をしているか分からない」段階からで大丈夫です。まずは無料相談から。

無料相談を予約する →
受講者の声 (DB・SQL コース)
menta レビュー原文を見る →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講