
「主キー」「複合主キー」「外部キー」の違いがわからない...
本記事では「主キー」「複合主キー」「外部キー」について紹介します。

主キー、複合主キー、外部キーの違い
「テーブル」「レコード」「カラム」「フィールド」といった基本用語の意味は次のとおりです。

スポンサーリンク
主キーとは
主キー(英:primary key、略:PK)とは、関係データベースのテーブル内で、レコードを一意に特定するためのカラムのことです。
テーブルには、大量のデータが保存されています。その大量データの中から、レコードを一意に特定するためには「キー情報」が必要です。それが「主キー」です。
例えば、次のテーブルの主キーは「社員番号」です。

主キーは、レコードを一意に特定するためのものです。そのため、主キーに指定したカラムに重複する値は設定できません。
主キーには「社員番号」や「製造番号」といった重複しない項目、または、一意性を確保するために「通し番号」のような項目を設定します。
主キーには、次の制約が課せられます。
制約 | 説明 |
一意制約 | データに重複がなく、必ず一意であること。主キーのカラムに同じデータが登録された場合、「一意制約」でエラーになる。 |
NOT NULL制約 | NULLを許可しない。主キーのカラムに「NULL」が登録された場合、この「NOT NULL制約」でエラーとなる。 |
複合主キーとは
複合主キー(英:composite primary key)とは、データベースのテーブルに設定される「主キー」を複数のカラムの組み合わせとして定義することです。
次の例は、複合主キー(複合キー)のイメージ例です。

上記のようなテーブルは、ひとつのカラムではレコードを一意に特定できません。(学年は重複する、組も重複する、出席番号も重複する、名前は同姓同名の可能性がある)
そのため「学年」「組」「出席番号」の組み合わせで、レコードを一意に特定しています。これが複合主キーです。
一意性を確保するために「通し番号」のようカラムを新たに設けるか、複数のカラムの組み合わせで(複合主キー)、一意性を確保します。
外部キーとは
外部キー(英:foreign key、略:FK)とは、関係データベースにおいてデータの整合性を保つための制約(参照整合性制約)のことで、外部キーに設定しているカラムには、参照先となるテーブルのカラム内に存在している値しか設定できません。
例えば、次のようなテーブルがあるとします。(左側は社員テーブル、右側は部署テーブル)

「社員テーブル(左側).部署ID」は、「部署テーブル(右側)」の主キーである「部署ID」に対して外部キーを設定しています。
そのため、「社員テーブル(左側).部署ID」には、「部署テーブル(右側).部署ID」に存在している値しか設定できません。
仮に参照先にないデータを登録しようとしても、制約エラーで登録できません。

上記のように「部署テーブル(右側).部署ID」に存在しない「部署ID = 4」というレコードを「社員テーブル」に追加すると、制約エラーとなり、登録できません。
また、参照元があるレコードは削除しようとしても、制約エラーで削除できません。

上記のように「部署テーブル(右側).部署ID=2」のレコードは、参照元があるので制約エラーとなり、削除できません。
「部署テーブル(右側).部署ID=2」のレコードを削除するためには、参照元である「社員テーブル(左側)」の対象のレコードを削除し、参照元がなくなった状態にする必要があります。参照元がなくなれば削除できます。