基本情報技術者試験 (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 NULL | NULL |
主キーと 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 の分類(どの命令がどちらか)
よくある疑問
自由に試す / 他のレッスンを読む
データベース分野をもっと学ぶ(おすすめ書籍)
イラスト主体で科目Aの全範囲を通読できる入門書。用語の土台を作ってから科目Bのアルゴリズムに入ると理解が速い。
科目Aの頻出テーマを図と語呂で押さえる入門書。参考書と問題集を兼ねるので初受験の一冊目に選びやすい。
公開問題を大量に解いて仕上げるための問題集。擬似言語の読解に慣れた後、本番形式で時間配分を試す段階で使う。
本セクションはAmazonアソシエイトのリンクを含みます。
プログラムの読み方でつまずいたら。
たいてっくが、アルゴリズムの追い方から SQL・データベース設計まで、1対1で学習をサポートします。「コードを目で追っても何をしているか分からない」段階からで大丈夫です。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)