主キー(プライマリキー)とは?
主キー(プライマリキー)とは、データベースで特定のテーブルにおけるレコード(データ行)を特定できる列のことです。主キーを設定することで、テーブル内でのデータの検索や管理、整合性の保持が容易になります。
たとえば、従業員の情報が記載されたテーブルに「従業員番号」「部署番号」「姓」「名」といった項目が存在する場合を考えましょう。各従業員に個別に割り当てられた「従業員番号」を主キーに設定することで、従業員番号をもとに特定の従業員の情報を正確に識別することが可能となります。
このように、主キーはデータベースを利用する際の速度や正確性を向上させられる、データベースにおいて重要な役割を果たすものです。
主キーの役割
主キーには、主に以下のような役割があります。
- テーブル検索の高速化:主キーが設定されていると、そのキーをもとにしたデータの検索やソートが迅速に行えます。
- データ整合性の保証:主キーは同じデータの重複登録を防ぎ、NULL値の登録も不可とすることで、データベース内の情報の整合性が維持できます。
主キーは、テーブル内のデータを一意に識別するために重複しない値を持つ必要があり、NULL値も登録できません。外部キーと併用することで、データベース内の異なるテーブル間でデータの整合性を保持するのにも役立ちます。
また、主キーは複数の列を組み合わた「複合主キー」として構成される場合もあります。レコードを一意に識別するために選択可能な列や列の組み合わせは「候補キー」と呼ばれ、その中から一つを選択したものが主キーです。データベース管理システム(DBMS)によっては、一意の番号を自動生成する機能を持つものもあり、主キーの生成・管理が用意になっています。
このように、主キーはデータベースの設計や運用の効率性を大きく左右する要素の一つであり、その選定には慎重な検討が必要です。
主キーの選び方
主キーを選ぶには、たとえば以下のような方法があります。
- マイナンバーなど公的に一意なデータを選ぶ
- 姓・生年月日・電子メールアドレスなどを組み合わせる
- データを追加するたびにIDを生成する
このうち最も良い方法は、データを追加するたびにIDを生成する方法です。たとえば顧客管理データベースであれば、顧客が追加される際に自動的に一意の番号を生成して、顧客IDとして主キーにするのがよいでしょう。
マイナンバーなど公的なデータは、たとえば外国の顧客は持っていない可能性もあります。
主キーではNULL値が許容されていないため、このような例外があるデータを主キーにはしにくいです。また、複数のデータを組み合わせる方法も、主キーが長くなり扱いにくいため避けたほうがよいでしょう。
IDを自動生成すると、端的でわかりやすいデータで、NULL値も避けられるなど多くのメリットがあります。データの整合性が取りやすく、検索も迅速に行えるため、主キーを選ぶ際はこのような自動生成の手法が推奨されることを覚えておきましょう。
主キーの具体例
データベースを扱わない人にとっては主キーという言葉が馴染みない場合も多いかもしれませんが、実際には多くの人が日常生活で無意識のうちに主キーを頻繁に扱っています。
たとえば、学生や会社員には、学生番号・社員番号といった一意の識別番号が割り当てられています。また、政府が割り当てた一意に識別可能なマイナンバーや運転免許証番号も、それぞれの人を一意に識別するために使用される主キーの例です。
別の例として、銀行が管理するデータベースについて考えてみましょう。銀行が管理するデータベースには顧客データを扱うもの・口座データを扱うものの2種類が存在します。
顧客データを扱うデータベースに記録されているのは顧客の名前・生年月日・住所などで、口座データを扱うデータベースに記録されているのは口座開設日・口座タイプ・引き出し限度額などです。
それぞれのデータベースで顧客を一意に識別するためには、2人の顧客が同じ一意の値を持つことがない情報が必要となります。これが主キーで、1つの列または列の組み合わせによって選択されます。名前や生年月日などの項目は、同じ情報を持つ顧客が複数いる可能性があるため、主キーの候補から外されます。
主キーの制約
主キーにはさまざまな制約があります。主な主キーの制約は以下のとおりです。
- データの各行に対して一意の値を含む必要がある。
- null値を含むことはできない。
- すべての行に主キーの値が記録されている必要がある。
主キーは、データベース上にすでに存在するフィールドを使用することもあれば、特定の追加フィールドを追加して主キーを作成することもあります。すでに存在するフィールドから自然に使用できるキーのことを「自然キー(ナチュラルキー)」、キーとして機能させるために追加したフィールドを「人工キー(サロゲートキー)」と呼びます。
主キーを設定する際には、データベースに対して「主キー制約」を指定します。主キー制約は、たとえばMySQLデータベースのSQLではテーブルや列を追加する際に「PRIMARY KEY (列名)」を使用することで設定可能です。
主キーと外部キーの違い
主キーと混同しやすい言葉として「外部キー」があります。両者の違いはどこにあるのでしょうか。
主キーは、ここまで説明しているとおり、データベース内のテーブルで各レコードを一意に識別するために使用される列です。たとえば、学生番号や社員番号のように、各個人を明確に識別できる番号がこれに該当します。
一方で外部キーは、別のテーブルの主キーを参照して、テーブル間の関連を表現する列です。わかりやすく言えば、複数のテーブルをつなげる役割を持つデータを指します。外部キーを使用することで、テーブルのデータが別のテーブルの特定のデータとどのように関連しているかを定義できます。
また、外部キーとして設定する項目は、参照先のテーブルの主キーに対応する値を持つ必要があります。この制約は、参照制約と呼ばれ、データの整合性を保つために重要です。
表を分けて外部キーで関連付ける理由には、データの重複を避け、管理を簡素化する目的があります。表を適切に分けてデータを管理することで、情報が変更された場合の修正箇所を少なくできるなどの利点があるのです。