「主キーで管理します」「このカラムが主キーになります」。データベースの設計や開発の会話でよく出てくる「主キー」という言葉。具体的に何のことか、なぜ必要なのかがわかりにくいと感じる方もいるのではないでしょうか。
この記事では、主キー(PRIMARY KEY)とは何かを、身近な例を使ってやさしく解説します。
この記事でわかること
- 主キーとは何か(シンプルな定義)
- なぜ主キーが必要なのか
- 主キーを設定しないとどうなるか
- 実務でよく見る主キーの具体例
- 初心者がつまずきやすいポイント
主キーとは?
主キー(PRIMARY KEY)とは、**データベースのテーブルの中で、各レコード(行)を一意に識別するための列(カラム)**のことです。
「一意」とは「重複しない、ただ1つの」という意味です。つまり、主キーの値はテーブル内で絶対に重複しないことが保証されます。
身近な例で考えると
マイナンバーを思い浮かべてください。日本国民には1人に1つのマイナンバーが割り当てられており、同じ番号を持つ人は存在しません。仮に「田中太郎」という同姓同名の人が複数いたとしても、マイナンバーで区別できます。
データベースの主キーはこれと同じです。
たとえば、顧客テーブルで考えてみましょう。
| 顧客ID(主キー) | 氏名 | メールアドレス |
|---|---|---|
| 001 | 田中 太郎 | tanaka@example.com |
| 002 | 田中 太郎 | tanaka2@example.com |
| 003 | 鈴木 花子 | suzuki@example.com |
「田中太郎」が2人いても、顧客IDが001と002で区別できています。これが主キーの役割です。
なぜ主キーが必要なのか
主キーがないと、次のような問題が起きます。
同じデータを区別できない 「田中太郎さんの注文履歴を表示して」とシステムに命令したとき、同姓同名の人が複数いたらどちらのデータを取得すればよいかわかりません。
データの更新や削除で間違いが起きる どのレコードを変更・削除するかを正確に指定できないため、意図しないデータが変更されるリスクがあります。
テーブル間の関係が作れない 複数のテーブルを関連づけるとき(「この注文は誰のものか」など)、主キーが基準になります。主キーがなければ、テーブルをつなぐことができません。
IT現場ではどう使われるか
実際の業務システムでは、次のような主キーが使われることが多いです。
- 顧客テーブル → 顧客ID(連番または UUID)
- 商品テーブル → 商品コード
- 注文テーブル → 注文番号
- 社員テーブル → 社員番号
「社員番号で管理してください」「注文IDをキーにして検索します」といった会話が出てきたら、それは主キーを使ったデータ管理の話です。
初心者がつまずきやすいポイント
名前や住所を主キーにしてはいけない 名前は同姓同名があり、住所は変わることがあります。主キーは「変わらない・重複しない」ものを選ぶのが原則です。
主キーは後から変えにくい 主キーは他のテーブルからも参照されるため、後から変更すると影響範囲が大きくなります。設計段階での決定が重要です。
「複合主キー」という考え方もある 1つの列だけでなく、複数の列を組み合わせて主キーとするケースもあります(例:「商品ID+注文日」で一意にする、など)。
自動採番(AUTO INCREMENT)が使われることが多い 「1、2、3…」と自動的に番号が増えていく仕組みを使って、主キーを自動生成することが多いです。
関連用語
- 外部キー(FOREIGN KEY):別テーブルの主キーを参照する列。テーブル間の関係を作るのに使う
- ユニーク制約:重複を禁止する制約。主キー以外にも設定できる
- インデックス:検索を速くするための仕組み。主キーには自動的にインデックスがつく
- UUID:ランダムな長い文字列の識別子。連番の代わりに使われることがある
仕事で使うときの注意点
要件定義や設計レビューで「このデータをどのキーで管理しますか?」という議論が出てくることがあります。「どの項目で一意に識別するか」という観点で考えると、主キーの議論が理解しやすくなります。
また、「主キーが重複しました」というエラーが発生した場合、同じIDのデータが2回登録されようとしていることを意味します。データ移行やCSVインポート時によく起きるエラーです。
さらに学ぶなら
主キーを含むデータベース設計の全体像は、FEX-104「データベース入門」で体系的に学べます。テーブルの構造から設計の考え方まで、非エンジニア向けにわかりやすく解説しています。
- 自分に合う講座を探す:/course-diagnosis/
- IT基礎シリーズを見る:/courses/
- 講師クーポンを確認する:/coupons/