顧客 ID が消えた注文シート (参照整合性)
参照整合性 (referential integrity) とは、あるテーブルの外部キー列の値が、参照先テーブルの主キーとして必ず存在すること (または NULL であること) を DBMS が保証する制約であり、孤立した参照や不整合な関連を構造的に排除する仕組みである。
事故 — 顧客を消したら注文の宛先が不明になった
顧客シートで、退会した顧客 C-999 の行を削除した。 翌日、注文シートを見ると C-999 の注文が 3 件残っている。 宛先の顧客情報が引けなくなり、発送業務が止まった。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | 注文ID | 顧客ID | 顧客名 (VLOOKUP) | 商品ID | 金額 |
| 2 | ORD-001 | C-001 | 山田太郎 | P-042 | ¥9,800 |
| 3 | ORD-002 | C-999 | #N/A | P-018 | ¥7,600 |
| 4 | ORD-003 | C-999 | #N/A | P-042 | ¥9,800 |
| 5 | ORD-004 | C-999 | #N/A | P-018 | ¥7,600 |
原因 — 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 チェックのコストは通常無視できる。 性能問題が実測で確認された時だけ、局所的に外すかインデックス設計を見直す
関連トピック
キー設計そのものは キーの階層 、参照関係を図で表現する話は 関連 (リレーションシップ) を参照。
よくある疑問
もっと学びたい方へ(おすすめ書籍)
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)