MySQLの外部キー制約(FOREIGN KEY制約)とは?わかりやすく徹底解説!

こんにちは。ゆうせいです。

今回は「MySQLにおける外部キー制約(Foreign Key Constraint)」について、初めて学ぶ人にもわかりやすく説明していきます。

「外部キーって何?」
「制約ってどういう意味?」
そんな疑問を一つずつ解決していきましょう!


外部キー制約(Foreign Key Constraint)とは?

外部キーの基本

まずは用語の説明からいきましょう。

外部キー(Foreign Key)とは、あるテーブルの列が「別のテーブルの主キー(Primary Key)」を参照する仕組みのことです。

もっと身近な言葉に置き換えると…

「この値はあっちのテーブルにある “本人確認情報” と一致してないとダメだよ」

という“ルール”です。

なぜ必要なの?

外部キー制約は、データの整合性(せいごうせい)を守るために使われます。

例えば、「注文データ」を記録するテーブルがあるとします。
注文した人が「顧客テーブル」に登録されていない人だったら、変ですよね?

それを防ぐのが、外部キー制約の役割です。


具体例で理解しよう!

2つのテーブルを例にします

顧客テーブル(customers)
id(主キー)
name
注文テーブル(orders)
id(主キー)
customer_id(外部キー)
product_name

外部キーを使ったSQL

CREATE TABLE customers (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE orders (
    id INT PRIMARY KEY,
    customer_id INT,
    product_name VARCHAR(100),
    FOREIGN KEY (customer_id) REFERENCES customers(id)
);

このように書くことで、

  • orders.customer_id に入れられる値は
  • customers.id に存在する値でなければならない

というルールが課されます!


外部キー制約による「制約」とは?

制約(Constraint)とは、簡単にいうと「ルール」「縛り」のこと。

MySQLにおいては、以下のような動きを“自動”でしてくれます。

操作外部キー制約があると…
INSERT存在しない親IDを入れるとエラーになる
UPDATE親のIDを変更するとき、子も更新するか制御できる
DELETE親レコードを消すとき、子レコードの扱いを制御できる

ON DELETE と ON UPDATE のオプション

外部キーには、親テーブルの更新・削除に対しての「反応」を設定できます。

よく使われる4つの動作

オプション意味
RESTRICT子があると削除・更新できない(デフォルト)
CASCADE親が変わると子も一緒に変わる・消える
SET NULL親が消えると子の外部キーはNULLになる
NO ACTIONRESTRICTとほぼ同じ(MySQLでは違いなし)

例:CASCADEを使ってみる

CREATE TABLE orders (
    id INT PRIMARY KEY,
    customer_id INT,
    product_name VARCHAR(100),
    FOREIGN KEY (customer_id) REFERENCES customers(id)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

この設定では:

  • 顧客が削除されたら、その人の注文も自動で削除されます
  • 顧客IDを更新したら、注文データの顧客IDも自動更新されます

便利ですが、誤って全部消える危険もあるので注意が必要です!


外部キーを定義するための条件と注意点

外部キー制約を使うためには…

  1. 親テーブルの列は PRIMARY KEYUNIQUE であること
  2. 親と子の列のデータ型・長さが同じであること
  3. 両方のテーブルが InnoDBストレージエンジン を使っていること

MySQLでは、MyISAMエンジンでは外部キー制約は効きませんので注意!


外部キーのメリット・デメリット

メリット

  • データの整合性を自動で守れる
  • 不正データの混入を防げる
  • アプリケーション側のチェックが不要になる

デメリット

  • 設計が複雑になりやすい
  • データ削除時に気を使う必要がある(誤削除のリスク)
  • 高度なSQL処理(バルクインサートなど)でエラーになることもある

外部キーがあるときのトラブルと対処法

よくあるエラー

  • 外部キー違反(親に存在しないIDを入れた)
  • 削除時の制約違反(親を消そうとして子が残っている)

対処法の例

SET foreign_key_checks = 0;
-- 外部キー制約を一時的に無効にする(削除やインポートのときに使う)

-- 処理後、必ず元に戻す
SET foreign_key_checks = 1;


今後の学習の指針

MySQLの外部キー制約は、テーブル間の「関係性(リレーション)」を設計するうえでの大事な基礎です。

次に学ぶべきテーマとしては:

  • ER図(エンティティ・リレーション図)の描き方
  • JOIN句(INNER JOIN / LEFT JOINなど)を使ったデータ取得
  • トランザクション処理と外部キーの関係
  • ON DELETE SET NULLCASCADEの具体的な活用場面

このあたりを押さえておくと、業務レベルでもしっかり通用しますよ!


必要であれば、図解つきのマニュアルやPDF形式の資料にもできますので、お気軽にお知らせください。さらに深く学んでいきましょう!


セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。