同じ番号が2人に付いたら
データベースの表(テーブル)は、同じ種類のデータを、行と列で入れておく入れ物です。そして主キーという列を決めておくと、同じ行が2つできるのを防げます。
ある店で、2人の会員に同じ会員番号が付き、ポイントが別の人に入ってしまいました。データベースなら、2つ目の同じ番号は入れる時点で断ります。
このレッスンのゴール
メモ
主キーを持つテーブルを設計できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| テーブル | 1種類のものを、行と列で入れておく表 | |
| 行(レコード) | 表の中の1件分のデータ | |
| 列(フィールド) | 表の中の、同じ種類の値が縦に並ぶ部分 | price |
| データ型 | 列に入れてよい値の種類 | INT |
| 主キー | 行を1つずつ区別する列。同じ値は2度使えない | id |
| 外部キー | 別の表の行を指す列 | club_id |
学生が入力するセルは、このプレビューでは空白です。
テーブルには何が入るのか
リレーショナルデータベースは、データをテーブルに入れます。1つのテーブルには、1種類のものだけを入れます。生徒、商品、注文などです。
1行が1件、1列が1つの項目です。次の表は、文化祭の模擬店を並べたもので、1行が1つの店を表します。
試す: 模擬店の表を読む
-- 模擬店の表を、全部の列で読みます。
SELECT * FROM stalls;
-- 次に、id が 3 の行だけを読む形に変えてみましょう。
データ型で入る値が決まる
列にはそれぞれデータ型があります。数字の列に文字を入れようとすると、データベースは断ります。
型を選ぶときは、その値で何をするかを考えます。足し算をするなら数の型、日にちの計算をするなら日付の型です。
例: データ型の選び方
| 入れる事実 | 型 | 理由 |
|---|---|---|
| 在庫の個数 | INT | 整数だけでよい |
| 円の値段 | INT | 1円未満はないので整数でよい |
| ドルの値段 | DECIMAL(8,2) | セントまで正確に持てる |
| 店の名前 | VARCHAR(40) | 40文字までの文字列 |
| 出荷した日 | DATE | 日数の計算を任せられる |
| 販売終了か | BOOLEAN | はいかいいえだけ |
学生が入力するセルは、このプレビューでは空白です。
始める前に
メモ
上のバーの Start the lab を押し、マシンが動き出すまで待ってください。Run ボタンは、順番にコマンドを自分専用のターミナルに入力します。
証明書を受け入れる設定
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ショップ用の短い名前
alias sql='mariadb -h db -u student -pstudent shop -t -e'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
主キーは行の名札
主キーは、行ごとに値が違う列です。空(NULL)にはできません。
多くの場合、データベースが数えてくれる番号を使います。AUTO_INCREMENT です。同じ番号の2行目は断られます。
2つの列を組み合わせて、1つのキーにすることもあります。その場合は、組み合わせが重ならないようにします。
2つの列でできたキー
sql "DESCRIBE order_items"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
名前やメールアドレスを主キーにしがちです。名前は重なりますし、メールアドレスは変わります。データベースが数える番号を主キーにし、メールアドレスは UNIQUE の列として別に持ちます。
外部キーは別の表を指す
部活の名簿を考えます。部員の表に、部活の名前や部屋を何度も書き写すことはしません。部活の番号だけを入れます。
この列が外部キーです。その番号が部活の表にあるかを、データベースが毎回調べます。だから、存在しない部活の部員は入れられません。
自分のデータベースを作る
sql "CREATE DATABASE IF NOT EXISTS student_club"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
そのための短い名前
alias club='mariadb -h db -u student -pstudent student_club -t -e'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
clubs 表を作る
club "DROP TABLE IF EXISTS members, clubs; CREATE TABLE clubs (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(40) NOT NULL UNIQUE, room VARCHAR(20) NOT NULL)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
members 表を作る
club "CREATE TABLE members (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(40) NOT NULL, club_id INT NOT NULL, FOREIGN KEY (club_id) REFERENCES clubs(id))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
部活を2つ入れる
club "INSERT INTO clubs (name, room) VALUES ('サッカー部', 'グラウンド'), ('美術部', '美術室')"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
部活9の部員を入れる
club "INSERT INTO members (name, club_id) VALUES ('田中', 9)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。