外部キー制約とは
外部キー制約(Foreign Key Constraint)とは、データベースのテーブル間の関連性を保証する仕組みのことです。
簡単に言うと、「このテーブルのデータは、別のテーブルに存在するデータしか参照できないよ」というルールを設定することができます。
なぜ必要か
外部キー制約がないと、以下のような問題が発生する可能性があります
-
存在しないデータを参照してしまう
- 削除された顧客の注文データが残ってしまう
- 存在しない商品IDが登録されてしまう
-
データの整合性が保てない
- 関連するデータが不完全な状態になる
- バグの原因となり、デバッグが困難になる
外部キー制約を設定することで、データベース側がこれらの問題を自動的に防いでくれます。
具体例
「顧客(customers)テーブル」と「注文(orders)テーブル」があるとします。
テーブル定義例
-- 顧客テーブル
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100)
);
-- 注文テーブル
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
product_name VARCHAR(100),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
このFOREIGN KEYの部分が外部キー制約です。これにより、
-
ordersテーブルのcustomer_idは、必ずcustomersテーブルに存在するcustomer_idでなければならない -
customersテーブルから顧客を削除しようとすると、その顧客の注文がordersテーブルに残っている場合はエラーになる
動作イメージ
データ挿入の例
-- ✅ 正常に登録できる(customer_id=1は存在する)
INSERT INTO customers VALUES (1, '山田太郎');
INSERT INTO orders VALUES (1, 1, 'ノートPC');
-- ❌ エラーになる(customer_id=999は存在しない)
INSERT INTO orders VALUES (2, 999, 'マウス');
-- エラーメッセージ: 外部キー制約違反
CASCADE オプション
外部キー制約には、削除時の動作を指定できるオプションがあります。
CASCADE設定例
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
product_name VARCHAR(100),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
ON DELETE CASCADE -- 顧客削除時に関連する注文も削除
ON UPDATE CASCADE -- 顧客ID更新時に注文の顧客IDも更新
);
主なオプション
-
CASCADE: 親データの削除/更新時に子データも削除/更新 -
SET NULL: 親データの削除時に子データの外部キーをNULLに設定 -
RESTRICT: 子データが存在する場合は親データの削除を拒否(デフォルト)
まとめ
- 外部キー制約はテーブル間のデータ整合性を保証する仕組み
- 存在しないデータの参照を防ぎ、データの信頼性を高める
-
CASCADEなどのオプションで削除・更新時の動作を制御できる