カテゴリ: データベース 更新日: 2026/04/01

データベース設計の要!外部キー(Foreign Key)とは?初心者向けに徹底解説

外部キーとは?テーブル間の関係を保つ仕組みを説明
外部キーとは?テーブル間の関係を保つ仕組みを説明

先生と生徒の会話形式で理解しよう

生徒

「データベースのテーブルが複数あるとき、どうやって関連付けているんですか?バラバラにならないか心配です。」

先生

「そこで登場するのが『外部キー』という仕組みです。これがあるおかげで、違うテーブル同士が親子のように結びつき、データが矛盾するのを防いでくれるんですよ。」

生徒

「親子……?難しそうですが、私にもわかりますか?」

先生

「もちろんです。例えば『注文書』と『商品リスト』の関係で考えると分かりやすいですよ。一緒に見ていきましょう。」

1. SQLとは何か?

1. SQLとは何か?
1. SQLとは何か?

SQLは、データベースと呼ばれる「大量のデータを整理して保存する箱」に対して指示を出すための言語です。例えば、会員名簿の中から特定の人を探したり、新しい人を追加したりするときに使います。コンピュータに『このデータを見せて!』『この内容を書き換えて!』とお願いするための専用の言葉だと考えてください。

エンジニアの必須スキル「SQL」を、 図解と豊富な練習問題でゼロから体系的に学びたい人へ。 MySQLやPostgreSQLなど、各種データベースに対応した不朽の入門書です。

SQL 第2版 ゼロからはじめるデータベース操作をAmazonで見る

※ Amazon広告リンク

2. 外部キー(Foreign Key)の基本概念

2. 外部キー(Foreign Key)の基本概念
2. 外部キー(Foreign Key)の基本概念

データベースの世界では、ひとつの大きな表にすべての情報を詰め込むことはしません。情報は種類ごとに「テーブル」という表に分けて保存するのがルールです。しかし、バラバラにしたままでは、どの注文がどの商品なのか分からなくなってしまいます。そこで、テーブルとテーブルを紐付けるための「名札」のような役割を果たすのが外部キー(がいぶきー)です。

外部キーは、別のテーブルの情報を参照するために設定されます。例えば、「注文テーブル」の中に「商品番号」という列を作っておき、その番号を頼りに「商品テーブル」の詳細を見に行くという流れです。このように、他のテーブルのデータを指し示す列のことを外部キーと呼びます。

この仕組みがあることで、データの整合性(せいごうせい)が保たれます。整合性とは、データに矛盾がない状態のことです。外部キーを設定すると、存在しない商品番号を注文テーブルに入力しようとしたときに、データベースが『その商品は存在しませんよ!』とエラーを出して教えてくれるようになります。

3. なぜテーブルを分ける必要があるのか?

3. なぜテーブルを分ける必要があるのか?
3. なぜテーブルを分ける必要があるのか?

そもそも、なぜ最初から一つの表にまとめないのでしょうか。それは、データを管理しやすくし、間違いを減らすためです。これを専門用語で「正規化(せいきか)」と呼びますが、今は『スッキリ整理すること』と考えて大丈夫です。

もし一つの表に「注文者」「住所」「商品名」「価格」をすべて書くと、同じ人が何度も買い物をしたときに、その人の住所を何度も繰り返し書くことになります。もしその人が引っ越したら、すべての行の住所を書き換えなければならず、修正漏れが起きるかもしれません。しかし、「顧客テーブル」と「注文テーブル」に分けて外部キーでつないでおけば、顧客テーブルの住所を一箇所直すだけで、すべての注文データに反映されるようになります。

4. 具体的な例で見る外部キーの仕組み

4. 具体的な例で見る外部キーの仕組み
4. 具体的な例で見る外部キーの仕組み

ここでは、オンラインショップをイメージしてみましょう。「商品(products)」テーブルと、それを受け取る「注文(orders)」テーブルの2つを用意します。

まずは、元となる「商品テーブル」の内容を確認しましょう。ここでは「商品ID」がそれぞれの品物を識別する背番号になっています。


product_id | product_name | price
-----------+--------------+-------
1          | リンゴ       | 150
2          | バナナ       | 100
3          | メロン       | 1500
4          | ミカン       | 80

次に、誰が何を買ったかを記録する「注文テーブル」を作成します。ここで、「どの商品を買ったか」を記録するために product_id という列を作ります。これが外部キーになります。


CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_name VARCHAR(50),
    product_id INT,
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

このSQL文では、「注文テーブルの product_id は、商品テーブルの product_id を参照しますよ」という約束をしています。これにより、2つのテーブルが強力に結びつきます。

では、実際にデータを入れてみましょう。現在の注文テーブルは空っぽの状態です。


order_id | customer_name | product_id
---------+---------------+-----------
(データなし)

ここに、新しい注文データを追加(インサート)します。田中さんがリンゴ(ID: 1)を、佐藤さんがメロン(ID: 3)を買ったというデータを入れます。


INSERT INTO orders (order_id, customer_name, product_id)
VALUES (101, '田中太郎', 1);

INSERT INTO orders (order_id, customer_name, product_id)
VALUES (102, '佐藤花子', 3);

実行後の「注文テーブル」は以下のようになります。


order_id | customer_name | product_id
---------+---------------+-----------
101      | 田中太郎      | 1
102      | 佐藤花子      | 3

この product_id を辿れば、田中さんが150円のリンゴを買ったことがすぐにわかりますね。

5. 外部キーがデータを守る「制約」の力

5. 外部キーがデータを守る「制約」の力
5. 外部キーがデータを守る「制約」の力

外部キーの最も素晴らしい点は、間違った操作を防ぐ「ガードマン」になってくれることです。これを外部キー制約と呼びます。例えば、商品テーブルには「1番から4番」の商品しかありません。それなのに、間違えて「99番の商品が売れた」というデータを入れようとしたらどうなるでしょうか。


-- 存在しない商品ID(99)を登録しようとする
INSERT INTO orders (order_id, customer_name, product_id)
VALUES (103, '鈴木一郎', 99);

このSQLを実行しようとすると、データベースは次のようなエラーを返します。


Error: Cannot add or update a child row: a foreign key constraint fails...
(エラー:親テーブルに存在しない値なので、追加できません)

このように、外部キーを設定しておくことで、幽霊のような存在しないデータが混ざり込むのを未然に防いでくれます。これは、データの品質を高く保つために非常に重要な機能です。

また、商品テーブルからデータを消すときも守ってくれます。もし「リンゴ(ID: 1)」がすでに注文されているのに、商品テーブルからリンゴを削除しようとすると、『注文データがまだ残っているから、勝手に消せませんよ!』と止めてくれます。これにより、注文データだけが残って、商品詳細が不明になるという事態を回避できます。

6. 親テーブルと子テーブルの関係

6. 親テーブルと子テーブルの関係
6. 親テーブルと子テーブルの関係

外部キーで結ばれた関係では、参照される側(今回でいう商品テーブル)を親テーブル、参照する側(注文テーブル)を子テーブルと呼びます。親子関係を意識することは、データベース設計の第一歩です。

日常生活で例えるなら、学校の「クラス」と「生徒」の関係に似ています。「クラス名簿」が親で、「生徒名簿」が子です。生徒名簿には必ず「どのクラスに所属しているか」という情報がありますが、クラス名簿に存在しないクラスを生徒に割り当てることはできませんよね。もし新しいクラスができたら、まず親であるクラス名簿にそのクラスを登録してから、生徒を受け入れる必要があります。このように、データの追加には順番があることも、外部キーを理解する上でのポイントです。

7. 実際のシステム開発での活用シーン

7. 実際のシステム開発での活用シーン
7. 実際のシステム開発での活用シーン

外部キーは、あらゆるWebサービスやアプリで使われています。例えば、SNSアプリなら「投稿テーブル」と「ユーザーテーブル」が紐付いています。ある投稿が誰によって書かれたものかを示すために、投稿データの中にユーザーのIDを外部キーとして持たせています。

また、図書館の貸出システムであれば、「本テーブル」と「貸出記録テーブル」があります。貸出記録には「どの本を借りたか」という外部キーが含まれます。これにより、誰が今どの本を借りているのか、その本は今どこにあるのかを、矛盾なく正確に管理できるのです。一見地味な仕組みですが、私たちの便利なデジタル生活を支える屋台骨のような存在です。

このように、複雑に絡み合うデータを、外部キーという「糸」で丁寧につないでいくことが、良いデータベース設計の鍵となります。最初は「どの列を外部キーにすればいいんだろう?」と迷うかもしれませんが、まずは『この情報は、別のどの情報とセットで使いたいか?』を考えてみてください。それが、リレーショナルデータベース(関係性を持つデータベース)を使いこなすための最初の一歩になります。

カテゴリの一覧へ
新着記事
New1
Rails
Railsのログ設定を完全理解!初心者でもわかる構造化ログ・Request ID・logrageの使い方
New2
Ruby
Rubyの時刻と日付を完全ガイド!初心者でもわかるTime/Date/DateTimeの違いとフォーマット
New3
Ruby
Rubyの真偽とnilの評価ルールを完全ガイド!初心者でもわかる条件式の落とし穴回避術
New4
Ruby
Rubyの文字列比較とソートを完全解説!casecmp・<=>・Collationで初心者でも理解
人気記事
No.1
Java&Spring記事人気No1
データベース
SQLで複数テーブルを結合する方法を徹底解説!初心者でも図解でわかるJOINと集計の基本
No.2
Java&Spring記事人気No2
Rails
Hotwire超入門:Turbo Drive / Turbo Frames / Turbo Streams を一気に理解【Rails 7 / Rails 8】
No.3
Java&Spring記事人気No3
データベース
PostgreSQLが遅い原因を解決!初心者向けデータベースチューニングと高速化の基本
No.4
Java&Spring記事人気No4
Ruby
Rubyの真偽値とnilを徹底解説!初心者が知っておくべき判定ルールと安全な書き方
No.5
Java&Spring記事人気No5
Ruby
Rubyの安全ナビゲーション演算子(&.)を徹底解説!nilガードでエラーを防ぐ方法
No.6
Java&Spring記事人気No6
Ruby
Rubyの条件分岐をスッキリ!早期リターンとガード節で読みやすいコードへ
No.7
Java&Spring記事人気No7
Rails
Rails 7/8対応|RSpec入門:describe・context・it・expectを初心者向けに完全解説
No.8
Java&Spring記事人気No8
データベース
データベース設計の要!外部キー(Foreign Key)とは?初心者向けに徹底解説