データベースの表における主キーの役割として、最も適当なものはどれか。
- 0
表の各行を一意に識別する。
- 1
検索を速くするために、データの格納位置を記録する
- 2
異なる表の列と必ず関連付けられている
- 3
値を空欄にできない列であれば、必ず行を一意に識別する。
解答・解説を確認
正解0.表の各行を一意に識別する。
解説
主キーは、表の各行を一意に識別するための列または列の組です。主キーの値は重複せず、空欄にもできません。
- 出典
- 応用情報技術者H22秋期午前 問29(改題)
TERM GUIDE · DATA
主キー(primary key)とは、データベースの表の中で、各行を一意に識別するために設定する列、または列の組合せです。
例えば、生徒の情報を次のような表で管理するとします。
| 学籍番号 | 氏名 |
|---|---|
| S001 | 田中太郎 |
| S002 | 鈴木花子 |
| S003 | 田中太郎 |
この表では、「氏名」を使って行を特定することはできません。「田中太郎」という同じ氏名の生徒が複数いるからです。
一方、学籍番号が生徒ごとに異なるように決められていれば、
のように、学籍番号を指定するだけで一つの行を特定できます。
このような学籍番号を主キーとして設定できます。
主キーには、主に次の二つの条件があります。
① 値が重複しない
主キーは各行を一意に識別するためのものなので、異なる行に同じ主キーの値を設定することはできません。
例えば、学籍番号を主キーにしている場合、
| 学籍番号 | 氏名 |
|---|---|
| S001 | 田中太郎 |
| S001 | 鈴木花子 |
のように、二人の生徒に同じ「S001」を割り当てることはできません。これでは「S001」と指定しても、どちらの行なのか特定できないからです。
② NULLにできない(空欄にできない)
主キーには、値が存在しないことを表すNULLや空欄を設定できません。
例えば、
| 学籍番号 | 氏名 |
|---|---|
| S001 | 田中太郎 |
| 鈴木花子 |
のようにすると、2行目を学籍番号によって特定できません。
したがって、主キーは、
重複しない + NULLではない(空欄でない)
という性質をもちます。
主キーは、一つの列だけで構成する必要はありません。複数の列を組み合わせて一つの主キーにすることもできます。
これを複合主キーといいます。
例えば、次のような成績表を考えます。
| 学籍番号 | 授業ID | 素点 |
|---|---|---|
| S001 | M01 | 80 |
| S001 | E01 | 72 |
| S002 | M01 | 91 |
この場合、「学籍番号」だけでは主キーにできません。S001の生徒は複数の授業を受けるので、S001という値が何度も現れるからです。
「授業ID」だけでも主キーにできません。同じ授業を複数の生徒が受けるからです。
しかし、
学籍番号 + 授業ID
という組合せなら、
のように各行を一意に識別できます。
したがって、この二つを組み合わせて主キーにできます。
複合主キーの場合、主キー全体の値の組合せが重複しなければよく、ひとつの列で重複していてもかまいません。
主キーは行を一意に識別できればよいので、数値である必要はありません。文字列を主キーにすることもできます。
例えば、
なども主キーとして使用できます。
また、主キーの値は、できるだけ後から変化しないものを選ぶことが望ましいです。
例えば「氏名」は、
ため、主キーにはあまり適していません。
そのため、利用者ID、学籍番号、社員番号、商品番号などのように、一人または一つの対象につき一つだけ割り当てられ、原則として変化しない番号を用いることが多くあります。
なお、「値が変化しないこと」は主キーの絶対的な条件ではありません。主キーに必須なのは一意性とNULLを含まないことであり、値が変化しないことはデータを安定して管理するために望ましい性質です。
リレーショナルデータベースでは、データを複数の表に分けて管理し、それらを関連付けることが多くあります。
そこで使われるのが、主キーと外部キーです。
| 学籍番号 | 氏名 |
|---|---|
| S001 | 田中太郎 |
| S002 | 鈴木花子 |
生徒表では「学籍番号」が主キーです。
| 学籍番号 | 授業ID | 素点 |
|---|---|---|
| S001 | M01 | 80 |
| S001 | E01 | 72 |
| S002 | M01 | 91 |
成績表の「学籍番号」は、生徒表の「学籍番号」を参照しています。
このように、他の表の主キーなどを参照する列または列の組を外部キー(foreign key)といいます。
つまり、
主キー
→ その表の行を一意に識別する。
外部キー
→ 他の表の行を参照し、表同士を関連付ける。
という違いがあります。
外部キーによって表同士が関連付けられている場合には、データを追加する順序にも注意します。
例えば、
顧客表 → 口座表 → 取引明細表
という関係があり、
とします。
新しい顧客が口座を開設し、その口座に入金する場合、
という順序になります。
存在しない顧客番号を口座表から参照したり、存在しない口座番号を取引明細表から参照したりすることはできないためです。
したがって、
参照される側を先に登録し、参照する側を後から登録する
と考えるとよいでしょう。
リレーショナルデータベースでは、同じ情報を何度も保存しないように、データを複数の表に分けることがあります。このようにデータの重複などを減らすために表を整理することを正規化といいます。
例えば、次の受注データを考えます。
| 受注番号 | 発注者名 | 商品番号 | 商品名 | 個数 | 単価 |
|---|---|---|---|---|---|
| 001 | A社 | P01 | ボールペン | 10 | 100 |
| 002 | B社 | P01 | ボールペン | 20 | 100 |
| 003 | C社 | P02 | ノート | 5 | 200 |
このままでは、商品P01について「ボールペン」「100円」という情報が何度も保存されます。
商品番号によって商品名と単価が決まるのであれば、例えば、
| 受注番号 | 発注者名 | 商品番号 | 個数 |
|---|---|---|---|
| 001 | A社 | P01 | 10 |
| 002 | B社 | P01 | 20 |
| 003 | C社 | P02 | 5 |
| 商品番号 | 商品名 | 単価 |
|---|---|---|
| P01 | ボールペン | 100 |
| P02 | ノート | 200 |
のように分けることができます。
商品表では「商品番号」を主キーとして商品を一意に識別します。
受注表では「商品番号」を使って商品表のデータを参照します。したがって、受注表の商品番号は商品表を参照する外部キーとして利用できます。
このようにすると、商品名や単価を受注のたびに繰り返して保存する必要がなくなります。
EXAMPLE
表の各行を一意に識別する。
検索を速くするために、データの格納位置を記録する
異なる表の列と必ず関連付けられている
値を空欄にできない列であれば、必ず行を一意に識別する。
正解0.表の各行を一意に識別する。
主キーは、表の各行を一意に識別するための列または列の組です。主キーの値は重複せず、空欄にもできません。
PRACTICE