Access主キー・外部キー・リレーションシップを正しく理解する|参照整合性・正規化・結合クエリの実践とMOS試験対策

「主キーと外部キーの違いがよくわからない」「リレーションシップを設定しようとしたらエラーが出た」「参照整合性を設定すると何が変わるのか」——Accessを学び始めた方がもっともつまずきやすいのが、テーブル間の「つながり」を管理するリレーションシップの概念と操作です。

Accessはリレーショナルデータベース(RDB)管理システムです。Excelと根本的に異なるのは、データを目的別に複数のテーブルに分散させ、テーブル間の関係(リレーションシップ)を活用して集計・検索・帳票出力を行うという設計思想です。この仕組みの核となるのが主キー・外部キー・リレーションシップ・参照整合性の4概念です。本記事では、4概念を体系的に整理し、Accessでの設定手順・正規化の実践例・結合クエリへの応用・MOS Access試験の頻出ポイントまで一気通貫で解説します。

「Accessのデータベース設計を基礎から理解したい」「MOS Access試験でリレーションシップを確実に得点したい」という方は、ぜひ最後までご覧ください。

目次

主キー(PK)・外部キー(FK)の役割と設定方法

リレーションシップを理解する前に、まず「主キー」と「外部キー」の役割を正確に把握しておく必要があります。この2つはリレーションシップを機能させる「橋」の両端です。

主キー(Primary Key)とは:テーブルの「顔」となるフィールド

主キー(PK)は、テーブル内の各レコードを一意に識別するフィールド(または複数フィールドの組み合わせ)です。

主キーの条件説明
一意性(Unique)テーブル内で重複した値を持てない
非NULL空値(NULL)を持てない
不変性設定後は原則として変更しない

Accessで新しいテーブルを作成すると、初期状態でオートナンバー型(自動連番)の「ID」フィールドが主キーに設定されます。これは「レコードを追加するたびに自動で連番を振る」フィールドで、重複や空値の心配がなく最も安全な主キー設計です。実務では「顧客ID」「受注番号」「商品コード」のように業務固有の識別子を主キーに設定する場合もありますが、その場合は「重複・NULL・変更」のリスク管理が必要です。

外部キー(Foreign Key)とは:テーブルをつなぐ「参照フィールド」

外部キー(FK)は、別テーブルの主キーを参照するために自テーブルに持つフィールドです。外部キーを持つテーブルを「子テーブル(多側)」、参照される側のテーブルを「親テーブル(一側)」と呼びます。

例として「顧客テーブル」と「受注テーブル」を考えます。

テーブル主キー外部キー役割
顧客テーブル(親)顧客ID(PK)顧客の基本情報を管理
受注テーブル(子)受注番号(PK)顧客ID(FK)誰の注文かを顧客テーブルへの参照で管理

受注テーブルの「顧客ID」フィールドが外部キーです。顧客テーブルの「顧客ID」を参照することで「この注文は誰のものか」という情報を、受注テーブル内に顧客情報を全コピーせずに表現できます。これがRDBの本質的な強みです。

Accessで主キーを設定・変更する手順

  1. 対象テーブルをデザインビューで開く
  2. 主キーにしたいフィールド行を選択する
  3. ツールバーの「主キー」ボタンをクリック(またはフィールド行を右クリック→「主キー」)
  4. フィールド名左の行セレクターに鍵アイコンが表示されれば設定完了

複合主キー(複数フィールドを組み合わせて一意にする)を設定する場合は、Ctrlキーを押しながら複数のフィールド行を選択してから主キーボタンをクリックします。

リレーションシップの3種類と選び方

テーブル間の「つながり方」は、データの性質によって3種類に分かれます。設計時にどの種類を選ぶかで、データ構造と将来の拡張性が大きく変わります。

一対一(1:1)リレーションシップ

一方のテーブルの1レコードが、もう一方のテーブルの1レコードとのみ対応する関係です。

用途
セキュリティ上の分離社員テーブル(公開情報)と給与テーブル(機密情報)を別テーブルに分ける
オプション属性の分離顧客テーブルと顧客詳細テーブル(任意入力項目)を分ける

1:1はAccessでは比較的まれなリレーションです。「なぜ1つのテーブルにまとめないのか」という理由が明確でない場合は、テーブルを統合するほうがシンプルな設計になります。

一対多(1:N)リレーションシップ

一対多は実務で最もよく使われるリレーションの形です。「一の側(親テーブル)」の1レコードに対し、「多の側(子テーブル)」の複数レコードが対応します。

  • 1人の顧客 → 複数の受注(顧客テーブル:受注テーブル = 1:N)
  • 1つの商品カテゴリ → 複数の商品(カテゴリテーブル:商品テーブル = 1:N)
  • 1人の担当者 → 複数の案件(担当者テーブル:案件テーブル = 1:N)

この形がAccessのリレーションシップ設計の主役です。親テーブルの主キーを子テーブルの外部キーとして持つことで実現します。

多対多(M:N)リレーションシップとジャンクションテーブル

「1人の学生が複数の講座を受講し、1つの講座に複数の学生が在籍する」ような関係が多対多(M:N)です。Accessでは直接M:Nのリレーションを設定できないため、ジャンクションテーブル(中間テーブル)を使って2つの1:Nリレーションに分解します。

テーブル主キー説明
学生テーブル学生ID学生の基本情報
受講テーブル(ジャンクション)学生ID + 講座ID(複合)誰がどの講座を受講したかを記録
講座テーブル講座ID講座の基本情報

受講テーブルは「学生ID(FK)」と「講座ID(FK)」の2フィールドを複合主キーとして持ち、学生テーブルとの1:N・講座テーブルとの1:Nの二重リレーションで多対多を実現します。

Accessでリレーションシップを設定する手順

実際にAccessのリレーションシップウィンドウを使って設定する手順を解説します。あらかじめ主キーと外部キーに使うフィールドが各テーブルに存在する状態で進めてください。

リレーションシップウィンドウを開く

  1. Accessを開き、対象のデータベースファイル(.accdb)を開く
  2. リボンの「データベースツール」タブをクリック
  3. 「リレーションシップ」ボタンをクリック
  4. リレーションシップウィンドウが開く(すでにリレーションシップが設定されている場合は既存の線が表示される)

テーブルを追加してリンクを設定する

  1. 「デザイン」タブ→「テーブルの表示」をクリックし、リレーションを結ぶテーブルを追加する
  2. ウィンドウ内に各テーブルのフィールドリストが表示される
  3. 親テーブルの主キーフィールドをドラッグし、子テーブルの外部キーフィールドにドロップする
  4. 「リレーションシップの編集」ダイアログが開く
  5. 「参照整合性」の設定を行い(次節で解説)、「作成」をクリックする
  6. テーブル間に結合線が表示されれば設定完了

結合の種類(内部結合・外部結合)を選択する

「リレーションシップの編集」ダイアログにある「結合の種類」ボタンをクリックすると、3つの選択肢が表示されます。

種類動作ユースケース
結合1(内部結合)両テーブルで一致するレコードのみ表示対応データが必ず存在する場合(デフォルト)
結合2(左外部結合)親テーブルの全レコード+一致する子レコード受注のない顧客も一覧に含めたい場合
結合3(右外部結合)子テーブルの全レコード+一致する親レコード対応する親がない子レコードも抽出したい場合

通常業務では「結合1(内部結合)」が最も多く使われます。集計レポートで「実績がない月も表示したい」などの要件がある場合に左外部結合を選択します。

参照整合性の設定と効果

リレーションシップ設定で最も重要な選択が「参照整合性」です。これを有効にすることで、親テーブルに存在しない外部キー値を子テーブルに登録するといった「矛盾したデータ」を自動で防ぎます。

参照整合性が防ぐ「孤児レコード」問題

参照整合性なしでは、以下のような問題が起きます。

  • 孤児レコードの発生:顧客テーブルから顧客を削除しても、受注テーブルにその顧客IDを持つ受注が残り続ける
  • 存在しないIDの登録:受注テーブルに、顧客テーブルに存在しない顧客IDを持つレコードが登録される

参照整合性を有効にすると、Accessはこれらの操作を自動でブロックし、データの一貫性を保証します。

カスケード更新・カスケード削除の設定

「リレーションシップの編集」ダイアログで「参照整合性」にチェックを入れると、追加で以下の2つのオプションが選択可能になります。

オプション動作使いどころ
フィールドの連鎖更新親テーブルの主キーを変更すると、子テーブルの外部キーも自動更新商品コードを変更した際に受注テーブルも一括更新したい場合
レコードの連鎖削除親テーブルのレコードを削除すると、対応する子テーブルのレコードも自動削除顧客を退会処理する際に受注履歴も同時削除したい場合

カスケード削除は強力ですが危険を伴います。誤って親レコードを削除した場合、関連するすべての子レコードが一括削除されるため、重要なデータを扱うテーブルでは慎重に設定してください。受注明細・履歴・監査ログなどは連鎖削除の対象から除外するか、削除フラグによる論理削除の運用を検討します。

参照整合性違反エラーへの対処法

参照整合性を有効にしようとしたときに「既存データが参照整合性規則に違反しています」というエラーが表示されることがあります。対処手順は以下のとおりです。

  1. 子テーブルに、親テーブルに存在しない外部キー値を持つレコードがないか確認する
  2. クエリで左外部結合を使い「親テーブル側がNULLのレコード」を抽出して孤児レコードを特定する
  3. 孤児レコードを削除または修正してから、改めてリレーションシップを設定する

正規化の基礎とリレーションシップ設計の実践例

リレーションシップを正しく活用するには、テーブルを適切に「分割」する正規化の考え方が必要です。正規化とは、データの重複や矛盾を排除してテーブル構造を整理する設計手法です。

第1~第3正規形の概要

正規形ルール主な目的
第1正規形(1NF)各セルに1つの値のみ。繰り返しグループなし「商品1, 商品2, 商品3」などの列を排除する
第2正規形(2NF)複合主キーの場合、部分関数従属を排除主キーの一部にのみ依存するフィールドを別テーブルに分離する
第3正規形(3NF)推移的関数従属を排除主キー以外のフィールドに依存するフィールドを別テーブルに分離する

業務でのAccess設計では、少なくとも第3正規形を意識してテーブルを設計することが推奨されます。「1つのテーブルに情報を詰め込みすぎている」「同じ値を複数の行に手入力している」と感じたら、正規化を見直すサインです。

受注管理DBのリレーションシップ設計例

正規化を適用した受注管理データベースのテーブル構成例を示します。

テーブル主キー外部キー格納情報
顧客テーブル顧客ID会社名・担当者名・住所・電話番号
カテゴリテーブルカテゴリIDカテゴリ名
商品テーブル商品IDカテゴリID(FK)商品名・単価・在庫数
受注テーブル受注番号顧客ID(FK)受注日・配送先・担当者
受注明細テーブル受注番号+明細番号(複合)受注番号(FK)・商品ID(FK)数量・単価(受注時点の価格)

このように正規化されたテーブル群をリレーションシップで結ぶことで、「顧客ごとの受注件数集計」「商品別の売上金額集計」「特定期間の未出荷一覧」など、多様なクエリを柔軟に作成できます。

クエリでリレーションシップを活用する

リレーションシップを設定したら、複数テーブルを結合したクエリで活用しましょう。Accessのクエリデザインビューでは、リレーションシップで結ばれたテーブルを追加すると自動的に結合線が表示され、フィールドを選ぶだけで結合クエリが作成できます。

内部結合クエリ(両テーブルに一致するレコードのみ)

クエリデザインビューで「顧客テーブル」と「受注テーブル」を追加し、顧客IDの結合線が引かれた状態で「顧客名」「受注番号」「受注日」を選択すると、受注実績のある顧客一覧が取得できます。SQLビューでは以下のように表示されます。

SELECT 顧客テーブル.顧客名, 受注テーブル.受注番号, 受注テーブル.受注日
FROM 顧客テーブル INNER JOIN 受注テーブル
ON 顧客テーブル.顧客ID = 受注テーブル.顧客ID;

左外部結合クエリ(受注がない顧客も含む)

「受注のない顧客もリストに含めたい」場合は左外部結合を使います。クエリデザインビューで結合線をダブルクリックし、「結合の種類」を「左外部結合」に変更します。

SELECT 顧客テーブル.顧客名, 受注テーブル.受注番号, 受注テーブル.受注日
FROM 顧客テーブル LEFT JOIN 受注テーブル
ON 顧客テーブル.顧客ID = 受注テーブル.顧客ID;

受注がない顧客の「受注番号」「受注日」はNULL(空)として返されます。「受注がない顧客を抽出したい」場合はWHERE句に「受注テーブル.受注番号 IS NULL」を追加するだけで実現できます。

3テーブル以上の結合クエリ

「顧客名・受注日・商品名・数量・小計」を1つのクエリで取得するには、顧客テーブル・受注テーブル・受注明細テーブル・商品テーブルの4テーブルを結合します。デザインビューで4テーブルを追加すると、リレーションシップの設定に基づいて自動的に結合線が表示されます。必要なフィールドをドラッグするだけで複雑な結合クエリが完成します。小計は「数量 * 単価」の演算フィールドを追加することで表示できます。

MOS Access試験の出題傾向とリレーションシップ攻略

MOS Access 365試験では、リレーションシップに関する操作問題が必ず出題されます。試験問題では「リレーションシップを設定せよ」「参照整合性を有効にせよ」「フィールドの連鎖更新を設定せよ」といった形式が多く見られます。

MOS Access試験のリレーション関連出題パターン

出題パターン操作のポイント
テーブル間のリレーションシップを新規作成するリレーションシップウィンドウ→テーブル追加→ドラッグ&ドロップ
参照整合性を有効化する結合線をダブルクリック→「参照整合性」にチェック
連鎖更新・連鎖削除を設定する参照整合性チェック後に追加オプションをチェック
結合の種類を左外部結合に変更する「結合の種類」ボタン→「2」を選択
既存リレーションシップを削除する結合線を右クリック→「削除」

試験当日の操作で失敗しないためのチェックリスト

  • テーブルを閉じてからリレーションシップウィンドウを開く:開いたままのテーブルがあるとリレーション設定が制限される場合がある
  • ドラッグの方向を確認する:親テーブルの主キーフィールドから子テーブルの外部キーフィールドへドラッグするのが正しい方向
  • 「作成」ボタンを必ず押す:「リレーションシップの編集」ダイアログで「作成」をクリックしないとリレーションシップが確定されない
  • リレーションシップの保存を忘れない:ウィンドウを閉じる際に「保存しますか?」と表示されたら必ず「はい」を選ぶ
  • 参照整合性エラーへの対処:試験環境では問題文の指示通りに操作すれば既存データは整合性を満たしているはず。エラーが出た場合は手順を再確認する

よくある疑問Q&A

Q. リレーションシップを設定せずにクエリで結合することはできますか?

A. できます。クエリデザインビューでテーブルを追加し、手動で結合線を引くことで、リレーションシップ未設定でも結合クエリを作成できます。ただし参照整合性は働かないため、データの一貫性は手動管理になります。頻繁に使う結合はリレーションシップとして定義しておくと、クエリ作成のたびに自動で結合線が引かれるため作業効率が上がります。

Q. リレーションシップを削除すると、テーブルのデータも消えますか?

A. いいえ、消えません。リレーションシップはあくまで「テーブル間の関係を定義するルール」であり、データそのものではありません。リレーションシップを削除してもテーブルのレコードは保持されます。ただし参照整合性のガードが外れるため、以降は矛盾データが登録できる状態になります。

Q. オートナンバー型以外の主キーはどう設計すればよいですか?

A. テキスト型・数値型などのフィールドも主キーに設定できます。ただし「重複なし・NULLなし・変更しない」という3条件を業務ルールで保証する必要があります。例えば「商品コード(英数8桁・手入力)」を主キーにする場合、入力ミスや変更が発生したときの影響が大きくなります。迷う場合はオートナンバー型IDを主キーにし、業務コードは「重複なし」インデックスを設定した別フィールドとして持つ設計が堅牢です。

Q. ExcelとAccessのリレーションシップ機能は何が違いますか?

A. Excel 2013以降の「データモデル」機能でテーブル間のリレーションシップを定義することができます。ただしExcelのリレーションシップはピボットテーブル分析用の機能に限定されており、参照整合性の強制・フォームによるデータ入力・レポート生成といったRDB機能はありません。複数テーブルを活用したデータ管理・帳票業務にはAccessが適しています。

まとめ

本記事では、Accessのリレーションシップを中心に、主キー・外部キー・参照整合性・正規化・結合クエリまでを体系的に解説しました。

  • 主キーはレコードを一意に識別するフィールド。外部キーは他テーブルの主キーを参照するフィールドで、リレーションシップの橋渡し役
  • リレーションシップには1:1・1:N・M:N(ジャンクションテーブルで2つの1:Nに分解)の3種類がある
  • 参照整合性を有効にすることで孤児レコードや不整合データの発生を自動防止できる
  • カスケード削除は強力な機能だが、重要データへの適用は慎重に検討する
  • 正規化(1NF~3NF)を意識したテーブル設計と適切なリレーションシップの組み合わせが、柔軟なクエリを生み出す基盤になる
  • MOS Access試験ではリレーションシップ設定・参照整合性・結合の種類変更が頻出操作。手順を繰り返し練習することが最短の攻略法

リレーションシップはAccessの「本来の強さ」を引き出す核心機能です。今回解説した主キー・外部キー・参照整合性の概念と操作手順を身につけることで、Accessデータベースの設計力が大きく向上します。まずは手元のAccessで実際に2テーブルを用意し、1:Nのリレーションシップと参照整合性を設定してみることをお勧めします。

Accessのテーブル設計・クエリ・フォーム・レポートについては、当サイトの関連記事もあわせてご参照ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次