同じ社員番号が二人に
小さな会社が、社員の名簿を表計算ソフトで管理していました。2人の社員に、同じ社員番号31が付いてしまいました。
その結果、給与明細が別の人に届きました。
データベースなら、2つ目の31を入れようとした時点で断ります。今日は、その仕組みを作ります。
このレッスンのゴール
メモ
キーを持つテーブルを、リレーショナルデータベースの中に作れる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| テーブル | 1種類のものを、行と列で入れておく表 | |
| データ型 | 列に入れてよい値の種類 | INT |
| 主キー | 行を1つずつ区別する列。同じ値は2度使えない | id |
| 外部キー | 別のテーブルの行を指す列 | route_id |
| 制約 | 変更のたびにデータベースが調べる決まり | NOT NULL |
| NULL | 値がないことを表す印 |
学生が入力するセルは、このプレビューでは空白です。
テーブルは1種類のものを持つ
リレーショナルデータベースは、データをテーブルに入れます。1つのテーブルには、1種類のものだけを入れます。顧客、商品、注文などです。
列にはそれぞれデータ型があります。数字の列に文字を入れようとすると、断られます。
まず、ターミナルにログインのやり方を教えます。次の2つの Run は、このレッスン全体の準備です。
証明書を受け入れる設定
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ショップ用の短い名前
alias sql='mariadb -h db -u student -pstudent shop -t -e'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
表の列を見る
sql "DESCRIBE reviews"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: データ型の選び方
| 入れる事実 | 型 | 理由 |
|---|---|---|
| 在庫の個数 | INT | 整数だけでよい |
| 円の値段 | INT | 1円未満はないので整数でよい |
| ドルの値段 | DECIMAL(8,2) | セントまで正確に持てる |
| 都市の名前 | VARCHAR(40) | 40文字までの文字列 |
| 出荷した日 | DATE | 日数の計算をデータベースに任せられる |
| 販売終了か | BOOLEAN | はいかいいえだけ |
学生が入力するセルは、このプレビューでは空白です。
主キーは行の名札
主キーは、行ごとに値が違う列です。NULL にはできません。
多くの場合、データベースが数えてくれる番号を使います。AUTO_INCREMENT です。同じキーの2行目は断られます。
2つの列を組み合わせて、1つのキーにすることもあります。その場合は、組み合わせが重ならないようにします。
2つの列でできたキー
sql "DESCRIBE order_items"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
名前やメールアドレスを主キーにしがちです。名前は重なりますし、メールアドレスは変わります。データベースが数える番号を使い、メールアドレスは UNIQUE の列として別に持ちます。
外部キーは別の表を指す
荷物は、ある配送ルートで運ばれます。荷物の表に、ルートの詳しい情報は写しません。ルートの番号だけを入れます。
この列が外部キーです。その番号がルートの表にあるかを、データベースが調べます。
だから、存在しないルートで荷物を送ることはできません。
自分の表を2つ作ろう
このラボでは、student_ で始まる名前のデータベースを自由に作れます。小さな配送会社のために student_depot を作ります。
ショップのデータベースは、そのまま変わりません。順番に Run してください。エラーで終わる Run も、学習の一部です。
自分のデータベースを作る
sql "CREATE DATABASE IF NOT EXISTS student_depot"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
そのための短い名前
alias depot='mariadb -h db -u student -pstudent student_depot -t -e'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
2つの表をまとめて消す
depot "DROP TABLE IF EXISTS parcels, routes"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
routes 表を作る
depot "CREATE TABLE routes (id INT AUTO_INCREMENT PRIMARY KEY, town VARCHAR(40) NOT NULL UNIQUE, days INT NOT NULL DEFAULT 1)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
parcels 表を作る
depot "CREATE TABLE parcels (id INT AUTO_INCREMENT PRIMARY KEY, route_id INT NOT NULL, weight_kg DECIMAL(5,2) NOT NULL, sent_on DATE NOT NULL, FOREIGN KEY (route_id) REFERENCES routes(id))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ルートを2つ入れる
depot "INSERT INTO routes (town, days) VALUES ('Osaka', 1), ('Nagoya', 2)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ルート9で荷物を送る
depot "INSERT INTO parcels (route_id, weight_kg, sent_on) VALUES (9, 2.5, '2026-03-02')"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Osaka をもう一度入れる
depot "INSERT INTO routes (town) VALUES ('Osaka')"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
routes 表だけを消してみる
depot "DROP TABLE routes"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
さらに挑戦
配送会社に運転手の表を足します。student_depot に drivers 表を作ります。番号の主キー、名前、UNIQUE の免許証番号を持たせます。
次に ALTER TABLE で parcels に driver_id 列を足し、drivers への外部キーを付けます。決まりごとに、それに反する行を1つ入れて、本当に断られるかを確かめます。