データベース設計において、まず理解すべき概念の一つが「プライマリーキー(主キー)」です。膨大な情報が格納されるテーブルの中から、目的のデータを正確に、そして効率よく検索・管理するためには、プライマリーキーの存在が欠かせません。本記事では、プライマリーキーの特徴、他の制約との違い、設定方法などをわかりやすく解説します。
プライマリーキー(PK)とは
プライマリーキー(主キー)は、リレーショナルデータベース(RDB)において、テーブル内の各レコードを一意に識別するための列、あるいは列の組み合わせです。プライマリーキーは以下の特徴を持ちます。
・一意性:テーブル内で重複せず、全てのレコードで唯一無二
・非NULL性:必ず値が入る。NULL(値が存在しない状態)は認められない
・プライマリーキーは変更しないことが望ましい。ただし、これは運用上の原則であり技術的制約ではない
例えば、社員情報を管理する社員テーブルでは、社員番号や社員IDなどがプライマリーキーとして用いられます。プライマリーキーは重複なく、データの一意性と整合性を保つ重要な役割を担っています。
【例:社員テーブル】
社員番号 |
社員名 |
年齢 |
住所 |
所属番号 |
AAA0001 |
田中さん |
45 |
東京都XXXX-XXXX |
101 |
AAA0002 |
山下さん |
30 |
神奈川県XXXX-AAAA |
202 |
AAA0003 |
竹山さん |
37 |
東京都BBB-XXXX |
103 |
プライマリーキーを設定するメリット
プライマリーキーを適切に設定することで、以下のようなメリットが得られます。
・高速な検索が可能になる
プライマリーキーには自動的にインデックス(主キー索引)が作成されるため、特定のレコードを検索する処理が高速になります。プライマリーキーは一意性があるため、必ず目的のレコードを特定できるからです。
・整合性の確保
プライマリーキーが設定された列においては、同じデータを重複して登録することはできません。例えば、社員名は同姓同名が存在しうるうえ、曖昧性があるため、プライマリーキーには適さない、ということになります。
・他のテーブルとのリレーション構築が容易になる
プライマリーキーを基準に外部キー制約を設定することで、他のテーブルとの整合性を保ったリレーションが構築できます。理由は、プライマリーキーが一意性および不変性の性質をもち、必ず該当のデータを参照できるからです。
例えば、所属部署を管理する部署テーブルには、部署番号をプライマリーキーとして設定しておきます。
【部署テーブル】
部署番号 |
部署名 |
101 |
営業一課 |
102 |
営業二課 |
103 |
営業三課 |
201 |
総務課 |
202 |
秘書課 |
社員テーブルの部署番号に外部キー制約を設定し、部署テーブルの部署番号とリレーションを構築しておくと、必ず部署テーブルに登録されている部署に社員が所属するように関係を持たせることができます。
【例:社員テーブル】
社員番号 |
社員名 |
年齢 |
住所 |
部署番号 |
AAA0001 |
田中さん |
45 |
東京都XXXX-XXXX |
101 |
AAA0002 |
山下さん |
30 |
神奈川県XXXX-AAAA |
202 |
AAA0003 |
竹山さん |
37 |
東京都BBB-XXXX |
103 |
プライマリーキーの落とし穴
プライマリーキーには単独キーとして一列のみ指定することも、複数の列を組み合わせた「複合プライマリーキー」として指定することも可能です。しかし、プライマリーキーに多くの列を組み合わせた複合プライマリーキーを指定してしまうと、以下のようなデメリットを伴います。
・設計が複雑化する
複数の列が組み合わさることで、どの項目を主キーとして参照すればよいかが分かりにくくなります。
・パフォーマンスの低下
キーが長くなるほどインデックスのサイズも増加するため、検索・挿入のパフォーマンスに影響する場合があります。
・可読性の低下
複数のカラムを組み合わせて一意性を担保するため、システム開発者や保守担当者がテーブル構造やデータを理解するのが難しくなります。そのため、設計段階ではできるだけシンプルな単独のプライマリーキーを使用し、必要に応じてユニーク制約で補完するのが理想的です。
プライマリーキーの設定方法
プライマリーキーは、データベースに対してSQLを実行して設定します。テーブル定義時でも後からでも設定可能です。
例えば、以下の例では、テーブル作成の中で emp_id列をプライマリーキーとして定義しています。これにより、一意性と非NULLが自動的に適用されます。
CREATE TABLE employees ( |
既存のテーブルに対してプライマリーキーを設定する場合は、以下のSQLを実行します。
ALTER TABLE employees ADD PRIMARY KEY (emp_id) |
また、複合プライマリーキーを設定する場合は、以下のようなSQLを実行します。
CREATE TABLE orders ( order_id INT, product_id INT, PRIMARY KEY (order_id, product_id) ) |
一意キー(ユニークキー)とプライマリーキーの違い
データベースには、プライマリーキー以外にも様々な制約が存在します。中でも「一意キー(ユニークキー)」は、プライマリーキーと非常に似ており、混同されやすいため、それぞれの違いを明確に理解しておきましょう。ユニークキーは、プライマリーキーと同様に列の一意性を保証しますが、主に以下の点で異なります。
・ユニークキーはNULL値を許容する(複数あっても許容)
・ユニークキーは1つのテーブルに対して複数設定可能(プライマリーキーは1テーブルにつき1つのみ)
ユニークキーは補助的な一意性保証として使われます。例えば「メールアドレス」などが該当します。データが重複して入ることが絶対にない列に対して設定することで、誤って重複するデータが登録されるのを防ぎます。
外部キーとプライマリーキーの違い
外部キー(FOREIGN KEY)は、あるテーブルの列が他のテーブルのプライマリーキーを参照することで、テーブル間の整合性を保つ仕組みです。例えば、以下の例では、employeesテーブルのemp_id列を参照するordersテーブルを作成しています。これにより、ordersテーブルのemp_id列には、employeesテーブルのemp_idに存在する値しか登録できません。
CREATE TABLE orders ( |
プライマリーキーと外部キーの違いは以下のとおりです。
・プライマリーキー:自身のテーブル内で一意な識別を行う
・外部キー:他のテーブルとの関係性を構築するために使う
両者はデータベースの健全性を保つために連携して用いられます。
まとめ
本記事では、プライマリーキーについて解説しました。プライマリーキーは、テーブル内のレコードを一意に識別し、データベースの整合性を担保するために欠かせない制約です。ユニークキーや外部キーと混同されがちですが、それぞれ異なる役割と特性を持ちます。適切な設計と設定によって、データの正確性と検索効率が飛躍的に向上します。データベースの品質とパフォーマンスを高める第一歩として、プライマリーキーの理解を深めておきましょう。
- カテゴリ:
- キーワード: