基礎

顧客 ID が消えた注文シート (参照整合性)

定義

参照整合性 (referential integrity) とは、あるテーブルの外部キー列の値が、参照先テーブルの主キーとして必ず存在すること (または NULL であること) を DBMS が保証する制約であり、孤立した参照や不整合な関連を構造的に排除する仕組みである。

事故 — 顧客を消したら注文の宛先が不明になった

顧客シートで、退会した顧客 C-999 の行を削除した。 翌日、注文シートを見ると C-999 の注文が 3 件残っている。 宛先の顧客情報が引けなくなり、発送業務が止まった。

注文シート — 存在しない顧客への注文が残る
注文.xlsx
ABCDE
1注文ID顧客ID顧客名 (VLOOKUP)商品ID金額
2ORD-001C-001山田太郎P-042¥9,800
3ORD-002C-999#N/AP-018¥7,600
4ORD-003C-999#N/AP-042¥9,800
5ORD-004C-999#N/AP-018¥7,600
顧客シートの C-999 を消したので VLOOKUP が #N/A になる。しかし注文行は残ったまま (孤立参照)

原因 — Excel はシート間の参照を強制しない

Excel の VLOOKUP や参照式は「参照先が消えたら #N/A になる」だけ。「参照している行がいるから消せない」と教えてくれる仕組みがない。 削除時に「参照している注文はどうする?」と警告するか、削除を禁止するか、あるいは注文も一緒に消すか、 の判断を DBMS に任せる仕組みが必要になる。

解決策 — 外部キー制約 (FOREIGN KEY) と ON DELETE 挙動

RDB では、テーブル定義時に 「この列の値は別テーブルの主キーとして必ず存在すること」を宣言できる。存在しない値を挿入したり、参照されている行を削除しようとすると、DBMS が拒否する。

CREATE TABLE orders (
  id BIGINT PRIMARY KEY,
  customer_id CHAR(6) NOT NULL,
  product_id CHAR(6) NOT NULL,
  qty INT NOT NULL,
  FOREIGN KEY (customer_id) REFERENCES customers(id)
    ON DELETE RESTRICT,
  FOREIGN KEY (product_id) REFERENCES products(id)
    ON DELETE RESTRICT
);

-- 存在しない顧客への注文は挿入拒否
INSERT INTO orders (id, customer_id, product_id, qty)
  VALUES (1001, 'C-999', 'P-042', 1);
-- ERROR: insert or update on table "orders" violates foreign key constraint

-- 注文が残ったまま顧客を削除しようとしても拒否
DELETE FROM customers WHERE id = 'C-999';
-- ERROR: update or delete on table "customers" violates foreign key constraint
--        DETAIL: Key (id)=(C-999) is still referenced from table "orders".

ON DELETE の 4 種類の挙動

  • RESTRICT / NO ACTION (既定): 子から参照が残っていたら親の削除を拒否
  • CASCADE: 親を消すと子も自動的に消える。例: カート削除 → カート明細行も削除
  • SET NULL: 子の FK 列を NULL にする (FK 列が NULL 可の場合のみ)
  • SET DEFAULT: 子の FK 列を定義された既定値に戻す

境界事例と実務判断

  • CASCADE は便利だが危険: 「意図しない大量削除」を招きやすい。 純粋に親に従属するデータ (明細行、タグ紐付け) のみに限定するのが安全
  • 論理削除 (soft delete) との相性: deleted_at 列を持たせて論理削除する場合、 FK は物理行の存在を見るので「論理削除された親を子から参照できる」問題が残る。 ビジネスロジックで補完するか、履歴テーブルを分けるかの判断が必要
  • パフォーマンスへの影響: FK チェックのコストは通常無視できる。 性能問題が実測で確認された時だけ、局所的に外すかインデックス設計を見直す

関連トピック

キー設計そのものは キーの階層 、参照関係を図で表現する話は 関連 (リレーションシップ) を参照。

よくある疑問

Q.外部キー制約はパフォーマンス的に付けない方がいい?
A.挿入・更新・削除時に参照チェックのコストが乗りますが、多くの場合は無視できる程度です。データ品質を犠牲にしてまで外すべき場面は限定的で、性能問題が出た後に局所的に判断すべきです。
Q.ON DELETE CASCADE と RESTRICT はどう使い分ける?
A.「親を消したら子も自動的に消えていい」は CASCADE (例: カート削除 → カート内の明細行も自動削除、タグ削除 → 記事タグ紐付けの中間行も自動削除)、「子が残っていたら親を消させない」は RESTRICT (例: 顧客に注文が残っていたら削除禁止)。デフォルトは NO ACTION (実質 RESTRICT) が安全で、CASCADE は「子データが純粋に親に依存していて単独では意味を持たない場合」に限定する。
Q.論理削除 (deleted_at) と外部キーは共存できる?
A.できます。ただし FK は物理行の存在を見るため、deleted_at IS NOT NULL の親を子から参照できてしまう問題があります。ビジネスロジックで補完するか、履歴テーブルを分けるかの設計判断が必要です。
Q.外部キーを付けない代わりにアプリケーション側でチェックすれば?
A.アプリケーション経路 (バッチ / 別サービス / DBA の直接 SQL) を全て通せば理論上は可能ですが、抜け道が発生した瞬間にデータが壊れます。DBMS で構造的に保証する方が確実です。

もっと学びたい方へ(おすすめ書籍)

おすすめ
達人に学ぶDB設計徹底指南書 第2版
ミック

テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。

Amazon で見る →
SQLアンチパターン 第2版
Bill Karwin

実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。

Amazon で見る →
情報処理教科書 データベーススペシャリスト 2025年版
三好康之

IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。

Amazon で見る →
おすすめ
楽々ERDレッスン (CodeZine BOOKS)
羽生章洋

ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。

Amazon で見る →
達人に学ぶSQL徹底指南書 第2版
ミック

SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。

Amazon で見る →
[改訂3版]内部構造から学ぶPostgreSQL
勝俣智成 ほか

PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。

Amazon で見る →
理論から学ぶデータベース実践入門
奥野幹也

リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。

Amazon で見る →

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

もっと深くDBを学びたい方へ。

たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。

無料相談を予約する →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講