主キー しゅきー
簡単に言うとこんな感じ!
主キーは「データの身分証明書番号」みたいなものだよ!マイナンバーみたいに、テーブル内の各行を「これとこれは絶対に別人!」って断言できる、唯一無二の識別番号なんだ。これがないと、同姓同名の人を区別できなくて大混乱になっちゃうってこと!
主キーとは
主キー(プライマリキー) とは、データベースのテーブル内の各行(レコード)を一意に識別するための列(カラム)またはカラムの組み合わせのことです。英語では Primary Key(PK) と呼ばれ、テーブル設計の根幹をなす非常に重要な概念です。
主キーには2つの鉄則があります。① 値が重複しない(一意性) と ② 値が空(NULL)にならない(非NULL性) です。たとえば社員テーブルなら「社員ID」、商品テーブルなら「商品コード」が主キーになることが多く、この値さえわかれば目的のレコードを必ず1件だけ特定できます。
実務でシステムを発注・選定する際に「テーブル設計書を確認してほしい」と言われたとき、主キーが設定されているかどうかを見るだけで、そのデータベースが適切に設計されているかどうかの第一チェックになります。主キーのないテーブルは「住所録なのに誰が誰かわからない」状態と同じで、データの信頼性が大きく損なわれます。
主キーの3大ルールと役割
| ルール | 内容 | 違反するとどうなる? |
|---|---|---|
| 一意性(ユニーク) | 同じ値が2行以上存在してはいけない | 同じIDの人が2人いて区別できなくなる |
| 非NULL性 | 空(NULL)の値は許可されない | 「誰かわからない行」が生まれてしまう |
| 不変性 | できる限り値を変更しない | 変えると他テーブルとの連携が壊れる |
主キーの種類を覚えよう
主キーには大きく2種類あります。
- 自然キー(ナチュラルキー): 現実世界に存在する値を使う。例:マイナンバー、ISBN(書籍番号)、社員番号など
- 代理キー(サロゲートキー): システムが自動で採番する番号を使う。例:データベースが自動で振る連番(1, 2, 3…)や UUID
実務では代理キーが推奨されるケースが多いです。自然キーは「社員番号の付け方が変わった」「ISBNの桁数が変わった」など、外部の変更に引きずられてしまうリスクがあるからです。
複合主キーとは?
単一のカラムだけでは一意にできない場合、複数カラムの組み合わせを主キーにすることもできます。これを複合主キー(コンポジットキー) と呼びます。
例:「受講履歴テーブル」では「学生ID + 講座ID」の組み合わせが主キーになる(同じ学生が同じ講座を2回受講するケースがなければ)。
歴史と背景
- 1970年代: エドガー・F・コッド(IBM)がリレーショナルデータベースの理論を提唱。「候補キー」「主キー」という概念がこの時点で定義された
- 1974年: IBM研究所でSEQUEL(後のSQL)が開発され、PRIMARY KEY制約が実装される基盤が整う
- 1980年代: Oracle、DB2などの商用RDBMSが普及し、主キー制約がデータベース設計の標準として定着
- 1990年代: SQLが国際標準規格(ISO/IEC 9075)として整備され、PRIMARY KEY構文が標準化される
- 2000年代〜: Webアプリの普及に伴い、自動採番(AUTO_INCREMENT / SERIAL)や UUID が主キーとして広く使われるようになる
- 現在: NoSQLデータベース(MongoDBなど)でも「_id」フィールドとして主キーに相当する概念が採用されており、データ識別の考え方は不変
主キー・外部キー・インデックスの関係
主キーは単独で存在するだけでなく、外部キー(Foreign Key) や インデックス と密接に連携しています。
上の図のように、社員テーブルの「部署ID」(外部キー)は、部署テーブルの「部署ID」(主キー)を参照するというリレーション(関係)を作ります。これがリレーショナルデータベースの真髄であり、主キーがその起点になっています。
また、主キーに設定されたカラムにはデータベースが自動的にインデックス(索引)を作成します。これにより、主キーを使った検索は非常に高速になります。
SQLでの主キー設定例
-- テーブル作成時に主キーを設定する例
CREATE TABLE 社員 (
社員ID INT NOT NULL AUTO_INCREMENT,
氏名 VARCHAR(50) NOT NULL,
部署ID INT NOT NULL,
入社日 DATE,
PRIMARY KEY (社員ID), -- 主キーの指定
FOREIGN KEY (部署ID) -- 外部キーの指定
REFERENCES 部署(部署ID)
);
関連する規格・RFC
| 規格番号 | 内容 |
|---|---|
| ISO/IEC 9075(SQL標準) | SQLの国際標準規格。PRIMARY KEY制約の構文・セマンティクスが定義されている |
| ISO/IEC 10026(分散トランザクション) | 分散DB環境での主キー一意性保証に関連する規格 |