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 ACTION | RESTRICT とほぼ同じ(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も自動更新されます
便利ですが、誤って全部消える危険もあるので注意が必要です!
外部キーを定義するための条件と注意点
外部キー制約を使うためには…
- 親テーブルの列は PRIMARY KEY か UNIQUE であること
- 親と子の列のデータ型・長さが同じであること
- 両方のテーブルが 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 NULLやCASCADEの具体的な活用場面
このあたりを押さえておくと、業務レベルでもしっかり通用しますよ!
必要であれば、図解つきのマニュアルやPDF形式の資料にもできますので、お気軽にお知らせください。さらに深く学んでいきましょう!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール

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