表の中で各レコードを一意に識別するための列。
主キー(プライマリキー)とは、表の中で各レコード(1行)を一意に識別するための列です。「一意に識別する」とは、その値を指定すれば対象の行がただ1つに決まる、という意味です。
身近な例で考えると、マイナンバーや学籍番号に似ています。氏名は同姓同名がいて区別できないことがありますが、学籍番号なら必ず1人に決まります。表でも同じで、社員番号や会員番号のような重複しない列を主キーに選びます。
上の図解では、主キー「社員番号」の値(例:103)を指定すると、対応する行(佐藤次郎)が1つだけ特定される様子を示しています。主キーは1つの表に1つだけ設定でき、表の各行を確実に区別する役割を担います。
主キーに選ばれた列には、自動的に2つの制約(守らなければならないルール)が課されます。
・NOT NULL(ノットヌル):値が空(NULL)であってはならない
・UNIQUE(ユニーク):同じ値が2つ以上あってはならない(重複禁止)
この2つが必要な理由はシンプルです。もし値が空だと「どの行か」を指定できず、値が重複していると「同じ番号の行が2つ」になって1つに絞り込めません。つまり、空も重複もないからこそ、主キーは行を確実に1つに特定できるのです。
身近な例で考えると、クラスの出席番号に似ています。出席番号は必ず全員に割り当てられ(空がない)、同じ番号の人は2人いません(重複がない)。だからこそ「3番」と言えば1人に決まるのです。
複合主キーとは、2つ以上の列を組み合わせて1つの主キーとして使う仕組みです。単独の列では重複が生じるが、組み合わせれば一意になる場合に使います。
上の例では「注文明細テーブル」で、注文番号だけでは「どの商品か」が決まらず、商品IDだけでは「どの注文か」が決まりません。しかし「注文番号+商品ID」の組み合わせなら、001の注文のP01という行が1つに決まります。
なぜ複合主キーが必要か。EC(ネットショッピング)の注文のように、「1つの注文に複数の商品がある」という関係を表すとき、1行で1つの「注文×商品のペア」を表す表が必要になります。この表には商品を一意に識別できる単独の列がないため、2列を組み合わせて主キーにします。
注意点として、複合主キーを構成するどの列も NULL(空)が許されません。また、第2正規形(2NF)の観点からは「複合主キーの一部だけで決まる列があってはいけない」というルールが出てくるため、正規化と密接に関係しています。
| 種類 | 意味 | 例 | 特徴 |
|---|---|---|---|
| 自然キー | 業務上の意味を持つ列 | マイナンバー、社員番号 | 意味が分かりやすい。変更される可能性あり |
| 代理キー | 識別のためだけに付けた連番 | user_id: 1,2,3… | 変わらない・シンプル。意味は持たない |
主キーの値をどの列から選ぶかには、大きく2つの考え方があります。
自然キー(ナチュラルキー)は、業務上もともと意味を持つ列を使います。「社員番号」「商品コード」などです。人が見ただけで「何のIDか」が分かる利点がありますが、制度の変更で値が変わる可能性がある点が弱点です(例:社員番号の採番ルール変更)。
代理キー(サロゲートキー)は、識別だけを目的に自動的に付けた連番(1、2、3…)です。業務の意味は持ちませんが、値が変わることがなく、常に一意・シンプルであることが利点です。
身近な例で考えると、図書館の本棚番号(代理キー)と本のISBN(自然キー)の違いに似ています。どちらも1冊を特定できますが、棚番号は図書館が自由に付け直せる一方、ISBNは出版社が決めた番号で意味があります。どちらが「より良い主キーか」は設計の方針によります。
1つの表の中に、レコードを一意に識別できる列が複数あることもあります。たとえば社員表では「社員番号」でも「マイナンバー」でも1人に特定できます。このように一意に識別できる列(または列の組み合わせ)を候補キーと呼びます。
主キーは、その候補キーの中から代表として1つ選んだものです。
・候補キー:一意に識別できる列の候補(複数あってよい)
・主キー:候補キーの中から1つ選んだ正式な識別列
・代替キー:候補キーのうち主キーに選ばれなかったもの
身近な例で考えると、クラス委員を選ぶ場面に似ています。委員になれる資格のある人(候補キー)が何人かいて、その中から1人を正式な委員(主キー)に決める、というイメージです。短くて扱いやすい列を主キーに選ぶのが一般的です。