はじめに
実務でテストデータを作成していたときのことです。
データベースへデータを登録しようとしたら、エラーになりました。
原因を調べると、
主キー重複
一意制約違反
というメッセージ。
そのとき私は、
主キーって何だろう?
複合主キーって何?
なぜ登録できないの?
という状態でした。
今回は、当時の私と同じように悩んでいる方向けに、
- 主キーとは何か
- 複合主キーとは何か
- なぜ必要なのか
を、学校の出席番号を例に解説します。
主キーとは?
主キー(Primary Key)とは、「データを一意に識別するための鍵」 です。
例えば会員管理システムがあるとします。
| 会員ID | 名前 |
|---|---|
| 1001 | 田中 |
| 1002 | 佐藤 |
| 1003 | 鈴木 |
この場合、会員ID が主キーです。
会員IDが分かれば、
誰のデータなのか特定できます。
なぜ主キーが必要なの?
もし主キーがなかったらどうでしょう。
| 名前 |
|---|
| 田中 |
| 田中 |
| 田中 |
となった場合、
どの田中さんを更新すればいいのか分かりません。
そのため、データベースでは
絶対に重複しない値
を主キーとして設定します。
でも1つの項目だけでは足りない場合がある
ここで学校を例に考えてみます。
先生がつぎのようにいったとします。
出席番号1番の人、立ってください。
- 1組の1番
- 2組の1番
- 3組の1番
みんな立ってしまいます。
なぜなら、出席番号 だけでは生徒を特定できないからです。
複合主キーとは?
そこで、
クラス
+
出席番号
をセットで考えます。
| クラス | 出席番号 | 名前 |
|---|---|---|
| 1組 | 1 | 田中 |
| 1組 | 2 | 佐藤 |
| 2組 | 1 | 鈴木 |
この場合、
1組 + 1番
は田中さんだけです。
2組 + 1番
は鈴木さんだけです。
このように、
複数の項目を組み合わせてデータを特定する仕組み
を複合主キーと呼びます。
主キーとデータの違い
ここが私が最初につまずいたポイントでした。
例えば、
| クラス | 出席番号 | 名前 | 係 |
|---|---|---|---|
| 1組 | 1 | 田中 | 給食係 |
があるとします。
後日、
給食係
↓
保健係
になったとします。
| クラス | 出席番号 | 名前 | 係 |
|---|---|---|---|
| 1組 | 1 | 田中 | 保健係 |
この場合、
変わったのは
係
です。
一方、
1組 + 1番
という鍵は変わっていません。
つまり、
- クラス
- 出席番号
→ 鍵(主キー)
- 名前
- 係
→ データの中身
という違いがあります。
データベースがエラーを出す理由
では次のデータはどうでしょう。
| クラス | 出席番号 | 名前 |
|---|---|---|
| 1組 | 1 | 田中 |
| 1組 | 1 | 高橋 |
人は違います。
名前も違います。
しかし、
1組 + 1番
が重複しています。
そのためデータベースは、
その鍵は既に使われています
とエラーを出します。
実務で私が困ったこと
テストデータを作成しているとき、
私は
名前が違うから別データ
だと思っていました。
しかし実際には、
主キーが同じ
だったため登録できませんでした。
そこで初めて、
データベースは
「名前」ではなく
「主キー」
を見ていることを理解しました。
テストデータ作成で意識すること
テストデータを作るときは、
まず
このテーブルの主キーは何か?
を確認します。
複合主キーなら、
その組み合わせが重複しないようにデータを作成する必要があります。
まとめ
今回学んだことは次の3つです。
- 主キーはデータを特定するための鍵
- 複数の項目を組み合わせたものが複合主キー
- 主キーが重複するとデータベースは登録を拒否する
私自身、最初は「名前が違うなら別データでは?」と思っていました。
しかし、データベースは「人が見て違うか」ではなく、「鍵が違うか」 で判断します。
複合主キーは難しく感じますが、
学校の**「クラス + 出席番号」** で考えると理解しやすいと思います。
