0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

超簡単理解:主キー、外部キー、連動処理(cascade)

Last updated at Posted at 2025-01-28

主キー、外部キー、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

スクリーンショット 2025-01-28 15.47.20.png

「学生」の「学生証」なので、
学生証の方に外部キーを設定してあげれば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対多

スクリーンショット 2025-01-28 16.01.11.png

「ユーザー」の「投稿」なので、
投稿の方に外部キーをつけてあげれば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
);

多対多

多対多は少し特別なので注意してください。

スクリーンショット 2025-01-28 16.06.41.png
スクリーンショット 2025-01-28 16.07.51.png

「学生」は複数の「授業」を受けることができますし、
「授業」は複数の「学生」も受け入れることができます。

この場合は中間テーブルを作り、
中間テーブル内で双方を関連づける外部キーを二つ用意して、
主キーを二つの外部キーから作りましょう。

-- ユーザーテーブル
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
);

まとめ

  • 子要素となりそうな方に外部キーをつければよい
  • 多対多の場合は中間テーブルを設けて外部キーを二つ用意すればよい
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?