主キー、外部キー、cascadeとは
テーブル同士を関連づけたい時ってありますよね?
外部キーをつけてあげればいいんです(詳しい方法は次の章)。
そしてテーブル同士が関連づいたということは、一方に変更があった時にはもう一方も変更したいですよね。そういう時は外部キーを設定する時に、cascadeで変更と削除の連動処理を設定してあげればOKです。
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主key
name VARCHAR(255)
);
CREATE TABLE user_profiles (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主key
user_id INT UNIQUE, -- 外部key
bio TEXT,
FOREIGN KEY (user_id)
REFERENCES users (id)
ON DELETE CASCADE -- 連動
ON UPDATE CASCADE -- 連動
);
- 主キー:データのid
- 外部キー:他のテーブルの主キー
- cascade:外部キーでつながったテーブルの連動して変更や削除するための設定
外部キーの設定方法
外部キーの簡単な設定方法を自分なりに編み出しました。
図で説明していきますから、今から紹介する図が頭に浮かべばすぐに外部キーをつけられるはずです。
前提知識として、テーブル同士の関係性は3つあります。
- 1対1(学生と学生証)
- 1対多(ユーザーと投稿)
- 多対多(学生と授業)
外部キーは子要素となりそうな方につければいいです。
1対1
「学生」の「学生証」なので、
学生証の方に外部キーを設定してあげればOKです。
コード:
-- 学生テーブル
CREATE TABLE Student (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
-- 学生証テーブル
CREATE TABLE StudentCard (
id INT AUTO_INCREMENT PRIMARY KEY,
cardNumber VARCHAR(255) NOT NULL,
studentId INT UNIQUE, -- 外部key
FOREIGN KEY (studentId) REFERENCES Student(id) ON DELETE CASCADE
);
1対多
「ユーザー」の「投稿」なので、
投稿の方に外部キーをつけてあげればOKです。
コード:
-- ユーザーテーブル
CREATE TABLE User (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE
);
-- 投稿テーブル
CREATE TABLE Post (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
userId INT,
FOREIGN KEY (userId) REFERENCES User(id) ON DELETE CASCADE
);
多対多
多対多は少し特別なので注意してください。
「学生」は複数の「授業」を受けることができますし、
「授業」は複数の「学生」も受け入れることができます。
この場合は中間テーブルを作り、
中間テーブル内で双方を関連づける外部キーを二つ用意して、
主キーを二つの外部キーから作りましょう。
-- ユーザーテーブル
CREATE TABLE User (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE
);
-- タグテーブル
CREATE TABLE Tag (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE
);
-- 中間テーブル(ユーザーとタグの多対多の関係を管理)
CREATE TABLE User_Tag (
userId INT,
tagId INT,
PRIMARY KEY (userId, tagId),
FOREIGN KEY (userId) REFERENCES User(id) ON DELETE CASCADE,
FOREIGN KEY (tagId) REFERENCES Tag(id) ON DELETE CASCADE
);
まとめ
- 子要素となりそうな方に外部キーをつければよい
- 多対多の場合は中間テーブルを設けて外部キーを二つ用意すればよい