初心者でも怖くない!MySQLの外部参照制約でデータの整合性を守る極意
こんにちは。ゆうせいです。
新人エンジニアの皆さん、データベースを操作していて、あるテーブルのデータを消したら別のテーブルとの整合性が取れなくなって焦った経験はありませんか。
例えば、注文データはあるのに、その注文をしたはずのユーザー情報がどこにも存在しない。
そんな幽霊のようなデータが生まれるのを防ぐ強力な仕組みが、今回お伝えする外部参照制約です。
いっしょにデータベースの門番について学んでいきましょう!
外部参照制約ってなに?
外部参照制約(外部キー制約)とは、2つのテーブル間のつながりを保証するルールのことです。
専門用語では、外部キー(Foreign Key)と呼びます。
これを身近な例で例えてみましょう。
遊園地の入場券と、それを持つお客さんの関係を想像してください。
入場券(子テーブル)は、必ず実在するお客さん(親テーブル)に紐付いていなければなりません。
勝手に入場券だけが宙に浮いている状態は、遊園地の運営として困りますよね。
このように、親となるテーブルに存在する値しか、子のテーブルには入れられないように制限をかけるのが外部参照制約の役割です。
参照整合性とは
外部参照制約を語る上で欠かせないのが、参照整合性という言葉です。
これは、テーブル同士のデータのつながりが、常に正しく矛盾がない状態であることを指します。
もし外部参照制約がなければ、親テーブルのデータが削除されたのに、子テーブルに古いデータが残り続けるといった矛盾が発生します。
これを防ぐことは、システムの信頼性を守ることに直結します。
外部参照制約を使うメリット
なぜわざわざ制限をかけるのか、その利点を見ていきましょう。
- データの品質が保たれるデタラメなIDが登録されるのを、データベースが入り口でシャットアウトしてくれます。
- システム開発のバグを早期発見できるプログラムのミスで不正なデータを入れようとした際、データベースがエラーを返してくれるため、不具合にすぐ気づけます。
- 関連するデータの操作が楽になる親を消したときに子も同時に消す、といった自動処理を設定できるため、管理の手間が減ります。
外部参照制約のデメリットと注意点
良いことばかりに見えますが、気をつけるべき点も存在します。
- パフォーマンスへの影響データを追加したり削除したりするたびに、データベースが整合性のチェックを行います。大量のデータを高速で処理する必要がある場合は、このチェックが重荷になることがあります。
- 自由度が下がる開発中にテストデータを適当に入れたいときでも、制約に縛られてエラーになることがあります。厳格なルールは、ときに融通が利かない頑固な先生のようでもあります。
カスケード動作を理解しよう
外部参照制約には、親のデータが変わったときに子がどう動くかを決める設定があります。
これをカスケード動作と呼びます。
代表的な設定を表にまとめました。
| 設定値 | 内容 |
| CASCADE | 親を削除・更新したら、子も道連れで削除・更新する |
| SET NULL | 親が消えたら、子の値を空っぽ(NULL)にする |
| RESTRICT | 子がいる限り、親の削除や更新を禁止する |
| NO ACTION | RESTRICTとほぼ同じで、何もしない(エラーにする) |
例えば、退会したユーザーの投稿をすべて消すなら CASCADE ですし、投稿者は不明として残すなら SET NULL を選ぶことになります。
設計思想に合わせて慎重に選びましょう!
実際に書いてみよう
それでは、SQLでの書き方を確認しましょう。
以下の例では、親となるユーザーテーブルと、子となる注文テーブルを作成しています。
合計金額の計算式などを想定して、数値の計算が含まれる場合の記述に注目してください。
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
price INT,
quantity INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);ここで、注文の合計金額を求める計算式を考えてみましょう。
単価 数量
合計金額
という関係になりますね。
もし、単価が 1000 円で数量が 3 の場合、
となります。
このように計算される大切なデータだからこそ、その大元である user_id が正しいことは絶対に譲れない条件なのです。
まとめと今後のステップ
外部参照制約は、データベースの信頼性を支える縁の下の力持ちです。
最初はエラーが出て面倒に感じるかもしれませんが、それはデータベースがあなたのシステムを守ってくれている証拠です。
次の一歩として、以下のステップに挑戦してみてください!
- ON DELETE CASCADE を実際に動かして、データの連動を体感する。
- インデックス(Index)と外部キーの関係について調べてみる。
- ER図を書いて、テーブル同士のリレーションを視覚的に整理する練習をする。
データベース設計をマスターすれば、エンジニアとしての視座がぐっと高まります。
一歩ずつ、着実に進んでいきましょう。