Access データベースのテーブル間のリレーションシップを定義する方法

元の KB 番号:   304466

注意

難易度: 低シングル ユーザー コンピューターのユーザー インターフェイスに関する知識が必要です。 この資料は、Microsoft Access データベース (.mdb または .accdb) にのみ適用されます。

概要

この資料では、Microsoft Access データベースでリレーションシップを定義する方法について説明します。 この資料には次のトピックが含まれています。

  • テーブルのリレーションシップとは何ですか?
  • テーブルのリレーションシップの種類
    • 一対多リレーションシップ
    • 多対多リレーションシップ
    • 一対一リレーションシップ
  • テーブル間のリレーションシップを定義する方法
    • 一対多または一対一のリレーションシップを定義する方法
    • 多対多リレーションシップを定義する方法
  • 参照整合性
  • 連鎖更新と連鎖削除
  • 結合タイプ

テーブルのリレーションシップとは何ですか?

リレーショナル データベースでは、リレーションシップを使用すると、重複データを防ぐことができます。 たとえば、書籍に関する情報を追跡するデータベースを設計する場合、書籍のタイトル、発行日、発行元など、各書籍に関する情報を格納する「タイトル」という名前のテーブルを作成できます。 また、発行元の電話番号、住所、郵便番号など、発行元に関する情報を保存することもできます。 この情報をすべて [タイトル] テーブルに保存する場合、発行元が印刷する各タイトルについて、発行元の電話番号が重複します。

より良い解決策は、発行元の情報を「発行元」と呼ぶ別のテーブルに 1 回だけ格納することです。 次に、[発行元] テーブルのエントリを参照する [タイトル] テーブルにポインターを置きます。

データが同期されたままになるように、テーブル間の参照整合性を適用できます。 参照整合性リレーションシップは、あるテーブルの情報が別のテーブルの情報と一致することを確認するのに役立ちます。 たとえば、[タイトル] テーブルの各タイトルは、[発行元] テーブルの特定の発行元に関連付けられている必要があります。 データベースに存在しない発行元のタイトルをデータベースに追加することはできません。

データベース内の論理リレーションシップを使用すると、データのクエリとレポートの作成を効率的に行うことができます。

テーブルのリレーションシップの種類

リレーションシップは、キー列、通常は両方のテーブルで同じ名前を持つ列 (またはフィールド) のデータを照合することで機能します。 ほとんどの場合、リレーションシップは、主キーまたは各行の一意識別子列を、あるテーブルから別のテーブルのフィールドに接続します。 もう一方のテーブルの列は「外部キー」と呼ばれます。 たとえば、各書籍のタイトルの売上高を追跡する場合は、[タイトル] テーブルの主キー列 (「title_ID」と呼ぶ) と、「title_ID」という名前の [売上高] テーブルの列の間にリレーションシップを作成します。 [売上高] テーブルの [title_ID] 列は外部キーです。

テーブル間には 3 種類のリレーションシップがあります。 作成されるリレーションシップの種類は、関連する列の定義方法によって異なります。

一対多リレーションシップ

一対多リレーションシップは、最も一般的な種類のリレーションシップです。 この種類のリレーションシップでは、テーブル A の行がテーブル B 内に多数の一致する行を持つことができます。ただし、テーブル B の行は、テーブル A に一致する行を 1 つだけ持つことができます。たとえば、[発行元] テーブルと [タイトル] テーブルには一対多のリレーションシップがあります。 つまり、各発行元は多くのタイトルを作成します。 ただし、各タイトルは 1 つの発行元のみからのものです。

一対多リレーションシップは、関連する列の 1 つだけが主キーであるか、または一意の制約を持つ場合に作成されます。

Access のリレーションシップ ウィンドウでは、一対多リレーションシップの主キー側は 1 で示されます。 リレーションシップの外部キー側は、無限大記号で示されます。

Access のリレーションシップ ウィンドウにある 1 対多のリレーションシップの例のスクリーンショット。

多対多リレーションシップ

多対多リレーションシップでは、テーブル A の行はテーブル B 内に多数の一致する行を持つことができ、その逆も同様です。 このようなリレーションシップを作成するには、ジャンクション テーブルと呼ばれる 3 つ目のテーブルを定義します。 ジャンクション テーブルの主キーは、テーブル A とテーブル B の外部キーで構成されます。たとえば、[作成者] テーブルと [タイトル] テーブルには、これらのテーブルのそれぞれから [タイトル作成者] テーブルへの一対多リレーションシップによって定義される多対多リレーションシップがあります。 [タイトル作成者] テーブルの主キーは、[au_ID] 列 ([作成者] テーブルの主キー) と [title_ID] 列 ([タイトル] テーブルの主キー) の組み合わせです。

Access のリレーションシップ ウィンドウにある多対多のリレーションシップの例のスクリーンショット。

一対一リレーションシップ

一対一リレーションシップでは、テーブル A の行はテーブル B の一致する行を 1 つだけ持つことができ、その逆も同様です。 関連する列が両方とも主キーであるか、一意の制約がある場合、一対一リレーションシップが作成されます。

この方法で関連付けられているほとんどの情報は 1 つのテーブルにあるため、このようなリレーションシップは一般的ではありません。 一対一リレーションシップを使用して、次の操作を実行できます。

  • 多くの列を持つテーブルを分割する。
  • セキュリティ上の理由から、テーブルの一部を分離する。
  • 存続期間が短く、テーブルを削除することで簡単に削除できるデータを格納する。
  • メイン テーブルのサブセットにのみ適用される情報を格納する。

Access では、一対一リレーションシップの主キー側はキー記号で示されます。 外部キー側もキー記号で示されます。

テーブル間のリレーションシップを定義する方法

テーブル間にリレーションシップを作成する場合、関連フィールドの名前は同じである必要はありません。 ただし、主キー フィールドがオートナンバー型フィールドでない限り、関連フィールドは同じデータ型でなければなりません。 オートナンバー型フィールドと数値型フィールドを一致させることができるのは、両方の一致するフィールドの FieldSize/フィールドサイズ プロパティが同じ場合のみです。 たとえば、両方のフィールドの FieldSize/フィールドサイズ プロパティが長整数の場合、オートナンバー型フィールドと数値型フィールドを一致させることができます。 一致するフィールドが両方とも数値型フィールドの場合でも、同じ FieldSize/フィールドサイズ プロパティの設定が必要です。

一対多または一対一のリレーションシップを定義する方法

一対多または一対一リレーションシップを作成するには、次の手順を実行します。

  1. すべてのテーブルを閉じます。 開いているテーブル間のリレーションシップを作成または変更することはできません。

  2. Access 2002 または Access 2003 では、次の手順を実行します。

    1. F11 キーを押して、データベース ウィンドウに切り替えます。
    2. [ツール] メニューの [リレーションシップ] をクリックします。

    Access 2007、Access 2010、または Access 2013 では、[データベース ツール] タブの [表示/非表示] グループの [リレーションシップ] をクリックします。

  3. データベースにリレーションシップをまだ定義していない場合は、[テーブルの表示] ダイアログ ボックスが自動的に表示されます。 関連付けるテーブルを追加するが [テーブルの表示] ダイアログ ボックスが表示されない場合は、[リレーションシップ] メニューの [テーブルの表示] をクリックします。

  4. 関連付けるテーブルの名前をダブルクリックし、[テーブルの表示] ダイアログ ボックスを閉じます。 テーブルとテーブル自体の間にリレーションシップを作成するには、そのテーブルを 2 回追加します。

  5. 関連付けるフィールドを、あるテーブルからもう一方のテーブルの関連フィールドにドラッグします。 複数のフィールドをドラッグするには、Ctrl キーを押しながら各フィールドをクリックし、ドラッグします。

    ほとんどの場合、主キー フィールド (このフィールドは太字で表示されます) を、他のテーブルの外部キーと呼ばれる同様のフィールド (このフィールドは頻繁に同じ名前を持っています) にドラッグします。

  6. [リレーションシップの編集] ダイアログ ボックスが表示されます。 2 つの列に表示されるフィールド名が正しいことを確認します。 必要に応じて、名前を変更できます。

    必要に応じて、リレーションシップ オプションを設定します。 [リレーションシップの編集] ダイアログ ボックスで特定のアイテムに関する情報が必要な場合は、疑問符ボタンをクリックし、アイテムをクリックします。 (これらのオプションについては、この記事の後半で詳しく説明します。)

  7. [作成] をクリックしてリレーションシップを作成します。

  8. 関連付けるテーブルのペアごとに、手順 4 〜 7 を繰り返します。

    [リレーションシップの編集] ダイアログ ボックスを閉じると、レイアウトを保存するかどうかを確認するメッセージが表示されます。 レイアウトを保存するか、レイアウトを保存しないかにかかわらず、作成したリレーションシップはデータベースに保存されます。

    注意

    リレーションシップは、テーブルだけでなくクエリでも作成できます。 ただし、参照整合性はクエリでは強制されません。

多対多リレーションシップを定義する方法

多対多リレーションシップを作成するには、次の手順を実行します。

  1. 多対多リレーションシップを持つ 2 つのテーブルを作成します。

  2. 3 番目のテーブルを作成します。 これがジャンクション テーブルです。 ジャンクション テーブルで、手順 1 で作成した各テーブルの主キー フィールドと同じ定義を持つ新しいフィールドを追加します。 ジャンクション テーブルでは、主キー フィールドは外部キーとして機能します。 他のテーブルと同じように、他のフィールドをジャンクション テーブルに追加できます。

  3. ジャンクション テーブルで、他の 2 つのテーブルの主キー フィールドを含めるように主キーを設定します。 たとえば、「TitleAuthors」ジャンクション テーブルでは、主キーは [OrderID] および [ProductID] フィールドで構成されます。

    注意

    主キーを作成するには、次の手順を実行します。

    1. [デザイン] ビューでテーブルを開きます。

    2. 主キーとして定義するフィールドを選択します。 1 つのフィールドを選択するには、目的のフィールドの行セレクターをクリックします。 複数のフィールドを選択するには、Ctrl キーを押しながら、各フィールドの行セレクターをクリックします。

    3. Access 2002 または Access 2003 では、ツールバーの [主キー] をクリックします。

      Access 2007 では、[デザイン] タブの [ツール] グループの [主キー] をクリックします。

      注意

      複数フィールドの主キーのフィールドの順序をテーブルのフィールドの順序と異なるようにするには、ツールバーの [インデックス] をクリックして [インデックス] ダイアログ ボックスを表示し、「主キー」という名前のインデックスのフィールド名を並べ替えます。

  4. 各プライマリ テーブルとジャンクション テーブルの間に一対多リレーションシップを定義します。

参照整合性

参照整合性は、関連するテーブルのレコード間のリレーションシップが有効であること、および関連データを誤って削除または変更しないことを確認するために Access が使用するルールのシステムです。 参照整合性は、次のすべての条件に該当する場合に設定できます。

  • 主テーブルの一致するフィールドが主キーであるか、一意のインデックスを持っています。
  • 関連フィールドのデータ型は同じです。 例外は 2 つあります。 [オートナンバー型] フィールドは、FieldSize プロパティ設定が長整数の [数値型] フィールドに関連付けることができ、FieldSize プロパティ設定がレプリケーション ID の [オートナンバー型] フィールドは、FieldSize プロパティ設定がレプリケーション ID の [数値型] フィールドに関連付けることができます。
  • 両方のテーブルが同じ Access データベースに属しています。 テーブルがリンク テーブルである場合、それらは Access 形式のテーブルである必要があり、参照整合性を設定するには、テーブルが格納されているデータベースを開く必要があります。 他の形式のデータベースからのリンク テーブルには参照整合性を適用できません。

参照整合性を使用する場合は、次の規則が適用されます。

  • 主テーブルの主キーに存在しない関連テーブルの外部キー フィールドに値を入力することはできません。 ただし、外部キーに Null 値を入力できます。 これは、レコードが関連付けられていないことを指定します。 たとえば、存在しない顧客に割り当てられている注文を持つことはできません。 ただし、[得意先コード] フィールドに Null 値を入力することで、誰にも割り当てられていない注文を持つことができます。
  • 関連するテーブルに一致するレコードが存在する場合、主テーブルからレコードを削除することはできません。 たとえば、[受注] テーブルで従業員に割り当てられている注文がある場合、[従業員] テーブルから従業員レコードを削除することはできません。
  • そのレコードに関連するレコードがある場合、主テーブルの主キー値を変更することはできません。 たとえば、[受注] テーブルでその従業員に割り当てられている注文がある場合、[従業員] テーブルの従業員 ID を変更することはできません。

連鎖更新と連鎖削除

参照整合性が適用されるリレーションシップの場合、関連するレコードを Access に自動的に連鎖更新するか連鎖削除するかを指定できます。 これらのオプションを設定すると、通常は参照整合性ルールによって防止される削除および更新操作が有効になります。 主テーブルのレコードを削除するか、主キー値を変更すると、参照整合性を維持するために、関連するテーブルに必要な変更が加えられます。

リレーションシップを定義するときに [フィールドの連鎖更新] チェック ボックスをオンにすると、主テーブルのレコードの主キーを変更するたびに、Microsoft Access は自動的に主キーをすべての関連レコードの新しい値に更新します。 たとえば、[顧客] テーブルで顧客の ID を変更すると、[受注] テーブルの [得意先コード] フィールドは、その顧客の注文ごとに自動的に更新されるため、リレーションシップが壊れることはありません。 Access は、メッセージを表示せずに更新を連鎖します。

注意

主テーブルの主キーが [オートナンバー型] フィールドである場合、[オートナンバー型] フィールドの値を変更できないため、[フィールドの連鎖更新] チェック ボックスを選択しても効果はありません。

リレーションシップを定義するときに [レコードの連鎖削除] チェック ボックスをオンにすると、主テーブルのレコードを削除するたびに、Access によって関連テーブルの関連レコードが自動的に削除されます。 たとえば、[顧客] テーブルから顧客レコードを削除すると、すべての顧客の注文が [受注] テーブルから自動的に削除されます。 (これには、[受注] レコードに関連する [受注明細] テーブルのレコードが含まれます)。 [レコードの連鎖削除] チェック ボックスをオンにしてフォームまたはデータシートからレコードを削除すると、関連レコードも削除される可能性があることを示す警告が表示されます。 ただし、削除クエリを使用してレコードを削除すると、警告を表示せずに、関連テーブルのレコードが自動的に削除されます。

結合タイプ

3 つの結合タイプがあります。 これらは、次のスクリーンショットで確認できます。

3 つの結合タイプを示す結合プロパティのスクリーンショット。

オプション 1 は内部結合を定義します。 内部結合は、結合されたフィールドの値が指定された条件を満たす場合にのみ、2 つのテーブルのレコードがクエリの結果に結合される結合です。 クエリでは、既定の結合は、結合されたフィールドの値が一致する場合にのみレコードを選択する内部結合です。

オプション 2 は、左外部結合を定義します。 左外部結合は、右側のテーブルの結合フィールドに一致する値がない場合でも、クエリの SQL ステートメントの LEFT JOIN 操作の左側のすべてのレコードがクエリの結果に追加される結合です。

オプション 3 は、右外部結合を定義します。 右外部結合は、左側のテーブルの結合フィールドに一致する値がない場合でも、クエリの SQL ステートメントの RIGHT JOIN 操作の右側のすべてのレコードがクエリの結果に追加される結合です。