3秒でわかる
テーブルの行を1つに絞り込むための列。値の重複と空を許さない制約があり、更新や削除の対象を取り違えないための土台になります。
もう少し詳しく
どういうものか
テーブルの中の1行を、他のどの行とも取り違えずに指し示すための列、または複数列の組み合わせが主キーです。主キーに指定した列は2つの制約を必ず背負います。1つは一意性で、同じ値が2つの行に現れてはいけません。もう1つは非 NULL で、値が空の行は登録できません。この2つがそろってはじめて「この値を渡せば行が1つに決まる」と言い切れます。
多くの RDBMS では、主キーを定義した時点で一意インデックスが自動で張られます。主キーは行を識別する意味づけであると同時に、その列での検索を速くする物理的な仕組みでもあります。
なぜ必要か
主キーが無いテーブルでは、UPDATE や DELETE の WHERE 句で1行だけを狙うことができません。氏名や日付で絞っても、たまたま同じ値の行があれば巻き添えで書き換わります。修正しようとした1件が10件になり、しかも実行後に気づくことになります。
もう1つの理由は参照です。別のテーブルから「この行に紐づく」と書く外部キーは、参照先に主キー (または一意キー) があってはじめて張れます。主キーの設計は、テーブル単体ではなくテーブル同士のつなぎ方を決める作業でもあります。
具体例
CREATE TABLE members (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL
);
-- 複数列をまとめて主キーにする (複合主キー)
CREATE TABLE course_enrollments (
member_id BIGINT,
course_id BIGINT,
joined_at DATETIME NOT NULL,
PRIMARY KEY (member_id, course_id)
);下の例では、同じ人が同じコースへ二重登録されることを主キーそのものが弾いています。アプリ側で重複チェックを書き忘れても、データベースが最後の砦になります。
似た用語との違い
| 制約 | 重複 | 空の値 | 1テーブルでの個数 |
|---|---|---|---|
| 主キー | 不可 | 不可 | 1つだけ |
| 一意キー (UNIQUE) | 不可 | 許す実装が多い | いくつでも |
| 外部キー | 可 | 可 | いくつでも |
つまずきやすいところ
メールアドレスや社員番号のような業務上の一意な値を、そのまま主キーにする設計がよくつまずきます。メールアドレスは変更されますし、社員番号は制度改定で桁が変わります。主キーの値が変わると、それを参照している全テーブルを追いかけて直すことになります。
実務では、意味を持たない連番や UUID を主キーに置き、業務上の一意な値には UNIQUE 制約を別に付ける形が選ばれます。前者を代理キー、後者を自然キーと呼びます。
覚え方
「1行を名指しできる住所」と考えると外れません。住所が空でも重複でも、郵便は届きません。