次の方法で共有


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

初心者: シングル ユーザー コンピューター上のユーザー インターフェイスに関する知識が必要です。 この記事は、Microsoft Access データベース (.mdb または .accdb) にのみ適用されます。

概要

この記事では、Microsoft Access データベースでリレーションシップを定義する方法について説明します。 記事の内容は次のとおりです。

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

テーブル リレーションシップとは

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

より優れた解決策は、パブリッシャーの情報を 1 回だけ、"Publishers" と呼ばれる別のテーブルに格納することです。次に、"Publishers" テーブルのエントリを参照する "Titles" テーブルにポインターを配置します。

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

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

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

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

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

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

一対多リレーションシップは、最も一般的な種類のリレーションシップです。 この種のリレーションシップでは、テーブル A の行に、テーブル B に多数の一致する行を含めることができます。ただし、テーブル B の行には、テーブル A に一致する行を 1 つだけ含めることができます。たとえば、"Publishers" テーブルと "Titles" テーブルには一対多リレーションシップがあります。 つまり、各パブリッシャーは多くのタイトルを生成します。 ただし、各タイトルの発行元は 1 つだけです。

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

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

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

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

多対多リレーションシップでは、テーブル A の行にテーブル B に多数の一致する行を含めることができます。その逆も同様です。 このようなリレーションシップを作成するには、ジャンクション テーブルと呼ばれる 3 番目のテーブルを定義します。 ジャンクション テーブルの主キーは、テーブル A とテーブル B の両方の外部キーで構成されます。たとえば、"Authors" テーブルと "Titles" テーブルには、これらの各テーブルから "TitleAuthors" テーブルへの一対多リレーションシップによって定義される多対多リレーションシップがあります。 "TitleAuthors" テーブルの主キーは、 au_ID 列 ("Authors" テーブルの主キー) と title_ID 列 ("Titles" テーブルの主キー) の組み合わせです。

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

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

1 対 1 のリレーションシップでは、テーブル A の行にテーブル B 内の一致する行を 1 つ以上含めず、その逆も可能です。 1 対 1 のリレーションシップは、関連する列の両方が主キーであるか、一意の制約を持っている場合に作成されます。

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

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

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

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

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

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

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

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

  2. Access 2002 または Access 2003 では、次の手順に従います。

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

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

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

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

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

    ほとんどの場合、主キー フィールド (このフィールドは太字で表示されます) を 1 つのテーブルから、もう一方のテーブルの外部キーと呼ばれる類似のフィールド (このフィールドは同じ名前を持つ場合が多い) にドラッグします。

  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 で、[デザイン] タブの [ツール] グループの [主キー] をクリックします。

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

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

参照整合性

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

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

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

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

連鎖更新と削除

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

リレーションシップを定義するときにクリックして [ 関連フィールドの連鎖更新 ] チェック ボックスをオンにすると、プライマリ テーブル内のレコードの主キーを変更するたびに、すべての関連レコードの新しい値に主キーが自動的に更新されます。 たとえば、"Customers" テーブルで顧客の ID を変更した場合、リレーションシップが壊れないように、その顧客の注文ごとに "Orders" テーブルの CustomerID フィールドが自動的に更新されます。 Access は、メッセージを表示せずに更新を連鎖します。

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

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

結合の種類

結合の種類は 3 つあります。 次のスクリーン ショットで確認できます。

結合プロパティのスクリーンショット。3 つの結合の種類が示されています。

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

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

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