シカラボ

主キーとは?重複・NULL不可の条件と複合主キーの選び方【ITパスポート】

シカラボ編集部
主キーとは?重複・NULL不可の条件と複合主キーの選び方【ITパスポート】

同姓同名の会員が2人いたとして、どちらが本を借りたのかをどう見分けるでしょうか。名前では決まりません。だから表には「会員番号」のような列を用意します。行を1つに決めるためのこの列が主キーです。ITパスポート試験では平成21年秋期以降、繰り返し問われていて、聞かれ方もほぼ決まっています。3つの決まりと、外部キー・インデックスとの違いを整理していきます。

主キーとは

主キーとは、表の中の行を1つに特定するための列、または列の組合せのことです。

主キーに指定した属性(列)で、レコード(行)を一意に識別できるようにする。

(出典:ITパスポート試験 平成22年春期 問83)

「一意に識別する」とは、簡単にいうと「その値を指定したとき、該当する行が2つ以上にならない」ということです。会員番号を「10023」と指定したら、返ってくるのは1行だけ。登録のない番号を指定すれば0件になりますが、それは正常です。同じ番号の行が2つある状態が許されません。

シラバス上は、テクノロジ系の「技術要素」に含まれるデータベース設計のキーワードです。表と表を関連づける仕組みの土台になるので、正規化やE-R図の話にも必ず顔を出します。ここでつまずくと後の分野に響くため、定義だけは正確に押さえておきましょう。

面白いのは、IPAが同じ論点を何度も出していることです。シカラボに収録されているITパスポートの過去問のうち、問題文または正解選択肢に「主キー」が登場する問題は18問(2026年8月末のDB時点)。そのなかで「複数の列を組み合わせて主キーにしてもよいか」を問う問題が、平成21年秋期・平成28年秋期と繰り返し登場します。主キー=ID列が1本という思い込みを、試験側が狙って崩しにきているわけです。

具体例でイメージをつかむ

図書室の貸出管理で考えてみましょう。表は3つあります。文献表(本の情報)、社員表(借りる人の情報)、そして貸出表(誰がどの本をいつ借りたか)です。

文献表の主キーは文献番号、社員表の主キーは社員番号。ここまでは迷いません。問題は貸出表です。

たとえば社員番号1001の人が、文献番号A-30の本を借りたとします。この2つの組合せで行が決まりそうに見えます。ところが同じ人が、同じ本を半年後にもう一度借りることがあります。そうすると、文献番号と社員番号が同じ行が2つできてしまいます。これでは一意になりません。

では文献番号と貸出日ならどうでしょうか。平成22年春期の問93には「返却された文献をその日に違う社員に貸し出すことは可能」と書かれています。同じ本を同じ日に別の人が借りられるので、この2列でも同じ値の行ができます。社員番号も外せません。

そこで貸出日まで含めて、3つの列の組合せを主キーにします。「1001さんが、A-30を、4月5日に借りた」までそろえば、行が決まります。このように複数の列を組み合わせた主キーを複合主キーと呼びます。列ごとに見れば、同じ値が並んでいてもかまいません。

ただし、3列で足りるのは問題文に条件が置かれているからです。同じ問93には「同じ社員に対して返却した同一文献をその日のうちに貸し出すことはない」とも書かれています。この一文がなければ、同じ日に借り直した2行が同じ値になってしまいます。

貸出表ではどの2列を選んでも同じ値の行ができ、文献番号・社員番号・貸出日の3列を組み合わせて初めて行が1つに決まることを示した図

この問93では、貸出表の主キーとして「文献番号、社員番号と貸出日の組合せ」が正解になっています。列を1本選べばよい、という発想では解けません。業務上の条件まで読んで、はじめて何列必要かが決まるというところが、この型の問題の勘どころです。

外部キー・インデックスとの違い

主キーと並んで出てくるのが外部キーとインデックスです。役割がまったく違うので、区別しておきましょう。

観点主キー外部キーインデックス
役割行を1つに決める別の表の行を指し示す検索を速くする
同じ値の重複許されないありうるありうる
空の値(NULL)入れられない設計によっては入れられる—
何本つくれるか表に1つ表に複数表に複数

主キーがNULLを許さないことは、過去問でもはっきり問われています。

主キーの値として、NULLをもつことができない。

(出典:ITパスポート試験 平成26年春期 問64)

理由は、NULLが「値が入っていない」ことを示す特殊な値だからです。主キーはその行を1つに決めるための値なので、空の行があると、その行を特定する手段がなくなります。だから表の中で1行だけであっても、主キーにNULLは入れられません。

主キーは行を決める、外部キーは別の表を指す、インデックスは探す速さを上げる、という役割の違いを並べた図

覚え方は「決めるのが主キー、指すのが外部キー、速くするのがインデックス」です。3つとも「キー」や「索引」といった似た響きですが、目的はまったく別物だと押さえておきましょう。

試験ではこう出る

よく出るのは次の2つです。主キーの性質そのものを問う形と、具体的な表を見せて主キーを選ばせる形です。前者は選択肢の正誤判定、後者は貸出表のような複合主キーが題材になります。まずは性質を問う基本形からどうぞ。

腕試し問題

出典:ITパスポート試験 令和元年秋期 問66

関係データベースにおいて、主キーを設定する理由はどれか。

解答と解説

解説(解答せずに開けます)

正解はエです。

主キーを設定する理由は、表の中のレコードを一意に識別できるようにすることです。ここが定義そのものなので、迷わず選べます。

  • ❌ ア「算術演算の対象とならない」→ 主キーには数値の列も使えます。演算できるかどうかは主キーの条件ではありません
  • ❌ イ「検索できるようになる」→ 検索はどの列でもできます。速さを上げたいならインデックスの役割です
  • ❌ ウ「他の表からの参照を防止できる」→ むしろ逆で、主キーは外部キーから参照される側になります

もう1問、「1つの列とは限らない」ほうも見ておきましょう。

腕試し問題

出典:ITパスポート試験 平成28年秋期 問95

関係データベースにおける主キーに関する記述のうち、適切なものはどれか。

解答と解説

解説(解答せずに開けます)

正解はエです。複数のフィールド(列)を組み合わせて主キーにできる、という選択肢が正しい記述にあたります。誤答のアは「1行だけならNULLを設定できる」としていますが、行数に関係なく主キーにNULLは入れられません。空の値ではその行を1つに特定できないからです。ウの「外部キーとして参照できない」も逆で、参照される側になるのが主キーです。

まとめ

  • 主キーは、表の中の行を1つに特定するための列または列の組合せ
  • 同じ値の重複もNULLも許されない。どちらも行を一意に決められなくなるため
  • 1つの列とは限らない。貸出表のように、3列を組み合わせた複合主キーもある。ただし何列で足りるかは業務上の条件しだい
  • 外部キーは別の表を指し示す仕組み、インデックスは検索を速くする仕組みで、主キーとは目的が違う

主キーの3つの決まりは、そのまま正規化の判断材料にもなります。「この項目は何によって決まっているのか」を考えるとき、出発点になるのが主キーだからです。表を見て主キーを言えるようになったら、次は正規化へ進んでみてください。

この用語が出てくる回

主キーは正規化とセットで問われます。表を分ける判断そのものが主キーの話なので、続けて読んでおきましょう。

この記事のタグ

関連記事