3
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?

【DB】外部キー制約について

Posted at

外部キー制約とは

外部キー制約(Foreign Key Constraint)とは、データベースのテーブル間の関連性を保証する仕組みのことです。

簡単に言うと、「このテーブルのデータは、別のテーブルに存在するデータしか参照できないよ」というルールを設定することができます。

なぜ必要か

外部キー制約がないと、以下のような問題が発生する可能性があります

  1. 存在しないデータを参照してしまう

    • 削除された顧客の注文データが残ってしまう
    • 存在しない商品IDが登録されてしまう
  2. データの整合性が保てない

    • 関連するデータが不完全な状態になる
    • バグの原因となり、デバッグが困難になる

外部キー制約を設定することで、データベース側がこれらの問題を自動的に防いでくれます。

具体例

「顧客(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などのオプションで削除・更新時の動作を制御できる
3
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
3
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?