主キー (シュウキー) とは | 意味や読み方など丁寧でわかりやすい用語解説
主キー (シュウキー) の読み方
日本語表記
主キー (シュウキー)
英語表記
primary key (プライマリキー)
主キー (シュウキー) の意味や用語解説
主キーは、リレーショナルデータベースのテーブルにおいて、多数のレコード(行)の中から特定のレコードを一つだけ確実に識別するために設定される、特別なカラム(列)またはカラムの組み合わせである。データベースは膨大な量のデータを格納するが、その中から目的のデータを正確かつ迅速に見つけ出し、更新や削除を行うためには、各レコードを一意に特定できる識別子が必要不可欠となる。主キーはまさにその識別子の役割を担っており、データベースの整合性と信頼性を維持するための根幹をなす概念である。主キーには二つの厳格なルール、すなわち制約が課せられる。一つは「一意性制約」であり、テーブル内で同じ値を重複して持つことが許されない。もう一つは「非NULL制約」であり、値が空(NULL)であってはならない。この二つの制約によって、すべてのレコードが必ずユニークな識別子を持つことが保証されるのである。 主キーの制約についてより詳しく解説する。まず、一意性制約は、主キーに設定されたカラムの値がテーブル内で絶対に重複しないことを保証する。例えば、社員情報を管理するテーブルで「社員番号」を主キーにした場合、同じ社員番号を持つ社員が二人存在することはシステム上不可能になる。これにより、データの重複登録といった誤りを防ぎ、データの正確性を担保する。次に、非NULL制約は、主キーのカラムには必ず値が入力されていなければならないというルールである。識別子が設定されていないレコードが存在すると、そのレコードを特定する手段が失われてしまうため、このような事態を防ぐ目的がある。データベース管理システム(DBMS)は、これらの制約に違反するデータの挿入や更新を自動的に拒否することで、データの整合性を強制的に維持する。 主キーには、その性質から大きく分けて「自然キー」と「代理キー」の二種類が存在する。自然キーは、データが元々持っている属性の中から、一意性を満たすものを主キーとして採用する方式である。例えば、社員テーブルにおける「社員番号」、書籍テーブルにおける「ISBNコード」、国民情報における「マイナンバー」などがこれにあたる。これらの値は業務上の意味を持っており、人間にとっても直感的で分かりやすいという利点がある。しかし、ビジネスルールの変更によって値が変わりうる、あるいは必ずしも一意性が保証されないといった欠点も存在する。例えば、組織改編で社員番号の体系が変更された場合、主キーの値を更新する必要が生じ、関連するすべてのデータを修正する大変な作業が発生する可能性がある。 一方、代理キーは、データ本来の属性とは無関係に、システムが主キーとして利用するためだけに自動的に生成する値である。サロゲートキーや人工キーとも呼ばれる。代表的なものに、一番から順に割り振られる連番(シーケンスやオートインクリメント機能で生成)や、世界中でほぼ重複しないことが保証された非常に長い文字列であるUUID(Universally Unique Identifier)などがある。代理キーは業務上の意味を持たないため、ビジネスルールの変更の影響を受けず、値が変更されることもない。また、一意性はシステムによって保証されるため、設計者はキーの一意性について悩む必要がなくなる。これらの利点から、現代の多くのシステム開発では、自然キーよりも代理キーを主キーとして採用することが主流となっている。 単一のカラムだけではレコードを一意に特定できない場合、複数のカラムを組み合わせて主キーとすることも可能であり、これを「複合主キー」と呼ぶ。例えば、ECサイトの注文明細テーブルを考える。このテーブルには「注文ID」と「商品ID」というカラムが存在する。一つの注文(同じ注文ID)で複数の商品が購入されるため、「注文ID」だけでは明細を特定できない。同様に、一つの商品(同じ商品ID)は複数の注文に含まれる可能性があるため、「商品ID」だけでも不十分である。しかし、「注文ID」と「商品ID」の組み合わせであれば、「どの注文の、どの商品に関する明細か」を一意に特定できる。このように、複合主キーは複数の属性の組み合わせによって初めて一意性が保証されるようなデータ構造を表現する際に用いられる。 主キーが果たす役割は、単にレコードを識別するだけにとどまらない。リレーショナルデータベースの最も重要な特徴であるテーブル間の関連付け(リレーションシップ)において、中心的な役割を担う。あるテーブルの主キーは、別のテーブルでは「外部キー」として参照される。例えば、「社員テーブル」の主キーである「社員番号」を、「部署テーブル」に「所属社員番号」として持たせることで、社員と部署の関連付けが表現できる。この主キーと外部キーによる関連付けによって、データの一貫性を保ちながら、複数のテーブルに分散した情報を統合して扱うことが可能になる。これがリレーショナルデータベースの強力な機能の源泉である。 さらに、主キーはデータへのアクセス速度を向上させる上でも極めて重要である。多くのデータベース管理システムでは、主キーが設定されたカラムに対して自動的に「インデックス」という特殊なデータ構造を作成する。インデックスは、書籍の索引のように、目的のデータがどこにあるかを素早く見つけるための仕組みである。主キーにインデックスが作成されることで、何百万、何千万件という膨大なデータの中から、特定のレコードを瞬時に検索、更新、削除することが可能になる。主キーなしでデータを検索する場合、テーブルの先頭から一行ずつ順番に探す「フルテーブルスキャン」という非効率な処理が発生し、システムのパフォーマンスを著しく低下させる原因となる。 最後に、主キーを設計する上での考慮点を述べる。主キーに選ぶカラムは、その値が将来にわたって変更されない不変のものであることが強く推奨される。もし主キーの値が変更されると、そのキーを外部キーとして参照している他のすべてのテーブルの該当データを更新する必要があり、処理が複雑化し、データの不整合を引き起こすリスクが高まる。また、主キーの値はなるべくシンプルで、データサイズが小さい方が望ましい。特に、多くのテーブルから外部キーとして参照される場合、キーのデータサイズが大きいと、データベース全体の記憶容量を圧迫し、パフォーマンスにも悪影響を及ぼす可能性がある。これらの理由からも、業務ロジックとは無関係で、不変かつシンプルな値を持つ代理キーの採用が好まれる傾向にある。主キーは、データベース全体の設計品質を左右する極めて重要な要素であり、その特性を深く理解し、慎重に設計することが求められる。