TERM GUIDE · DATA

主キー

「主キー」とは

主キー(primary key)とは、データベースの表の中で、各行を一意に識別するために設定する列、または列の組合せです。

例えば、生徒の情報を次のような表で管理するとします。

学籍番号氏名
S001田中太郎
S002鈴木花子
S003田中太郎

この表では、「氏名」を使って行を特定することはできません。「田中太郎」という同じ氏名の生徒が複数いるからです。

一方、学籍番号が生徒ごとに異なるように決められていれば、

  • S001 → 1行目の田中太郎
  • S002 → 鈴木花子
  • S003 → 3行目の田中太郎

のように、学籍番号を指定するだけで一つの行を特定できます。

このような学籍番号を主キーとして設定できます。

主キーに必要な条件

主キーには、主に次の二つの条件があります。

① 値が重複しない

主キーは各行を一意に識別するためのものなので、異なる行に同じ主キーの値を設定することはできません。

例えば、学籍番号を主キーにしている場合、

学籍番号氏名
S001田中太郎
S001鈴木花子

のように、二人の生徒に同じ「S001」を割り当てることはできません。これでは「S001」と指定しても、どちらの行なのか特定できないからです。

② NULLにできない(空欄にできない)

主キーには、値が存在しないことを表すNULLや空欄を設定できません。

例えば、

学籍番号氏名
S001田中太郎
鈴木花子

のようにすると、2行目を学籍番号によって特定できません。

したがって、主キーは、

重複しない + NULLではない(空欄でない)

という性質をもちます。

複数列を組み合わせて主キーにする

主キーは、一つの列だけで構成する必要はありません。複数の列を組み合わせて一つの主キーにすることもできます。

これを複合主キーといいます。

例えば、次のような成績表を考えます。

学籍番号授業ID素点
S001M0180
S001E0172
S002M0191

この場合、「学籍番号」だけでは主キーにできません。S001の生徒は複数の授業を受けるので、S001という値が何度も現れるからです。

「授業ID」だけでも主キーにできません。同じ授業を複数の生徒が受けるからです。

しかし、

学籍番号 + 授業ID

という組合せなら、

  • S001・M01
  • S001・E01
  • S002・M01

のように各行を一意に識別できます。

したがって、この二つを組み合わせて主キーにできます。

複合主キーの場合、主キー全体の値の組合せが重複しなければよく、ひとつの列で重複していてもかまいません。

主キーにはどのような項目を選ぶか

主キーは行を一意に識別できればよいので、数値である必要はありません。文字列を主キーにすることもできます。

例えば、

  • 学籍番号:S001
  • 商品番号:P105
  • 顧客番号:A001

なども主キーとして使用できます。

また、主キーの値は、できるだけ後から変化しないものを選ぶことが望ましいです。

例えば「氏名」は、

  • 同姓同名の人がいる
  • 結婚などで変わることがある
  • 表記が変更されることがある

ため、主キーにはあまり適していません。

そのため、利用者ID、学籍番号、社員番号、商品番号などのように、一人または一つの対象につき一つだけ割り当てられ、原則として変化しない番号を用いることが多くあります。

なお、「値が変化しないこと」は主キーの絶対的な条件ではありません。主キーに必須なのは一意性とNULLを含まないことであり、値が変化しないことはデータを安定して管理するために望ましい性質です。

主キーと外部キー

リレーショナルデータベースでは、データを複数の表に分けて管理し、それらを関連付けることが多くあります。

そこで使われるのが、主キーと外部キーです。

生徒表

学籍番号氏名
S001田中太郎
S002鈴木花子

生徒表では「学籍番号」が主キーです。

成績表

学籍番号授業ID素点
S001M0180
S001E0172
S002M0191

成績表の「学籍番号」は、生徒表の「学籍番号」を参照しています。

このように、他の表の主キーなどを参照する列または列の組を外部キー(foreign key)といいます。

つまり、

主キー
→ その表の行を一意に識別する。

外部キー
→ 他の表の行を参照し、表同士を関連付ける。

という違いがあります。

データを追加する順序

外部キーによって表同士が関連付けられている場合には、データを追加する順序にも注意します。

例えば、

顧客表 → 口座表 → 取引明細表

という関係があり、

  • 口座表が顧客表の顧客番号を参照する
  • 取引明細表が口座表の口座番号を参照する

とします。

新しい顧客が口座を開設し、その口座に入金する場合、

  1. 顧客表に顧客を登録する
  2. その顧客番号を使って口座表に口座を登録する
  3. その口座番号を使って取引明細表に入金記録を登録する

という順序になります。

存在しない顧客番号を口座表から参照したり、存在しない口座番号を取引明細表から参照したりすることはできないためです。

したがって、

参照される側を先に登録し、参照する側を後から登録する

と考えるとよいでしょう。

主キーを使って表を分ける

リレーショナルデータベースでは、同じ情報を何度も保存しないように、データを複数の表に分けることがあります。このようにデータの重複などを減らすために表を整理することを正規化といいます。

例えば、次の受注データを考えます。

受注番号発注者名商品番号商品名個数単価
001A社P01ボールペン10100
002B社P01ボールペン20100
003C社P02ノート5200

このままでは、商品P01について「ボールペン」「100円」という情報が何度も保存されます。

商品番号によって商品名と単価が決まるのであれば、例えば、

受注表

受注番号発注者名商品番号個数
001A社P0110
002B社P0120
003C社P025

商品表

商品番号商品名単価
P01ボールペン100
P02ノート200

のように分けることができます。

商品表では「商品番号」を主キーとして商品を一意に識別します。

受注表では「商品番号」を使って商品表のデータを参照します。したがって、受注表の商品番号は商品表を参照する外部キーとして利用できます。

このようにすると、商品名や単価を受注のたびに繰り返して保存する必要がなくなります。

EXAMPLE

例題

主キー · EXAMPLE応用情報技術者H22秋期午前 問29(改題)

データベースの表における主キーの役割として、最も適当なものはどれか。

  1. 0

    表の各行を一意に識別する。

  2. 1

    検索を速くするために、データの格納位置を記録する

  3. 2

    異なる表の列と必ず関連付けられている

  4. 3

    値を空欄にできない列であれば、必ず行を一意に識別する。

解答・解説を確認

正解0.表の各行を一意に識別する。

解説

主キーは、表の各行を一意に識別するための列または列の組です。主キーの値は重複せず、空欄にもできません。

出典
応用情報技術者H22秋期午前 問29(改題)

PRACTICE

主キーの問題に挑戦