0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

俺「外部キー制約ってなんやねん」

Last updated at Posted at 2022-06-29

整合性を保つよ!

2つのテーブルの整合性を保つために用いられる工夫の一種だよ!

具体的に見ていこう👍

user_idカラムでユーザー情報を格納する

例えばあるWebアプリに次のテーブルがあるとする。

  • usersテーブル
    • ユーザーを管理する
  • postsテーブル
    • ユーザーの投稿を管理する

注目すべきは、postsテーブルには「誰が投稿したか」が分かるようにuser_idっていうカラムがあるところだ。

名前から推測できるように、このuser_idにはユーザーのid番号が入る。

中々良いアイデアだ。

誰が投稿したかを分かるように、postsテーブルに別のテーブル(今回で言うとusersテーブル)の情報を格納する。

ある投稿のuser_idカラムが10だったときは、idが10のユーザーが投稿したんだな、とこれで分かる。

存在しないユーザーのid

この設計には1つ問題が潜んでいる。

というか、余計なことができちゃう隙がある。

例えばそのアプリはユーザーが10人しかおらずidが1-10までしかないのに、user_idに例えば20が格納されてしまう可能性がある。

要は実在しないid番号ががpostsテーブルのuser_idに入る可能性がある(悪意のあるユーザーによって攻撃することができる)。

これを防ぐ仕組みが「外部キー制約」である。

外部キー制約で制限できるよ!

postsテーブルのuser_id外部キー制約をかけて連携対象をusersテーブルにする

すると、postsテーブルのuser_idにはusersテーブルに存在するid番号しか格納されないようになる。

外部のキーで制約するから、外部キー制約だよ!

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?