##前提
Qiita初投稿です!
ここでは
「親テーブルと子テーブル、どっちがどっちか分からん…」
「SQL文書いてて訳分かんなくなった!」
という人向けに、その考え方を超簡単に説明します。
今回はmacOSのterminalを使っています。
DB初心者のため、何か間違いがあればご連絡ください…。
##親テーブル・子テーブルとは?
複数のテーブルでデータベースを管理する時、
各テーブルを紐づける**「外部キー」**を使うことが出来ます。
この時
「親テーブル・子テーブル」にあたるテーブルがどれかによって
「どのテーブルの、どのカラムが外部キーになるのか?」が分かります。
外部キーの役割については調べると沢山出てくるので、ここでは割愛します。
要は外部キーを使って便利な制約を設定できる、という感じです。
一応文字で説明すると、
外部キーを設定して参照する側は子テーブル、参照される側は親テーブル
ということですが、
分かりづらいと思うので(私自身分からなかったので)具体例で見ていきましょう。
##具体例
例えば、社員を管理するデータベースにおいて
下の名簿テーブルに「社員ID、氏名、部署ID」の項目があるとします。
この時
「部署IDを、部署テーブルの『部署ID』に関連付けしたいな」
という場合に外部キーを利用します。
名簿テーブル
社員ID | 氏名 | 部署ID |
---|---|---|
001 | 佐藤 実 | B03 |
002 | 田中 隆 | A02 |
003 | 島田 花子 | A02 |
004 | 山田 太郎 | A01 |
部署テーブル
部署ID | 部署名 |
---|---|
A01 | 開発部 |
A02 | 営業部 |
B03 | 総務部 |
この時、
田中さんと島田さんの部署が知りたい!
→名簿テーブルの部署IDだけでは何の部署か分からない…。
→名簿テーブルから外部キー「部署ID」を使って部署テーブルの部署ID[A02]を参照
→営業部だと分かった!田中さんと島田さんは営業部だ!
という流れが起きます。
上で書いた「参照する・される」でいうと、
- 「名簿テーブル」が「部署テーブル」を参照している
- 「部署テーブル」は「名簿テーブル」に参照されている
- 参照する時、「部署ID」を使っている
ということですね。
以上の点から、
親テーブル:部署テーブル
子テーブル:名簿テーブル
外部キー:部署ID
となります。
※おさらい:
外部キーを設定して参照する側は子テーブル、参照される側は親テーブル
##コードで確認
実際にコードで確認してみましょう。
部署テーブル作成
create table department(
departmentID int,
departmentName varchar(255),
primary key(departmentID)
)engine=InnoDB;
名簿テーブル作成
create table user(
userID int,
name varchar(255),
departmentID int,
primary key(userID),
foreign key(departmentID)references department(departmentID)
)engine=InnoDB;
この時、子テーブルである名簿テーブルの作成時に「foreign key(外部キー)...
」を使って外部キーを設定することができます。
親テーブルで外部キー設定しようとするとエラーが出てうまく出来なかったりするので、
つまずいたら
「親テーブルと子テーブルは合っているか?」
を一度ゆっくり考えてみることをお勧めします。
外部キーについての分かりやすい記事はこちらがオススメです。