この資料では、Microsoft Access (以下 Access) データベースでリレーションシップを定義する方法について説明します。以下の内容が含まれています。
-
テーブル リレーションシップとは
-
テーブル リレーションシップの種類
-
一対多リレーションシップ
-
多対多リレーションシップ
-
一対一リレーションシップ
-
テーブル間のリレーションシップを定義する方法
-
一対多または一対一のリレーションシップを定義する方法
-
多対多リレーションシップを定義する方法
-
参照整合性
-
連鎖更新および連鎖削除
-
結合の種類
テーブル リレーションシップとは
リレーショナル データベースでは、リレーションシップを設定することによって、データが重複しないデータベースを設計することができます。たとえば、書籍に関する情報を蓄積するデータベースを設計する場合、タイトル、出版日、出版社など、各書籍に関する情報を Titles という名前のテーブルに格納することが考えられます。また、出版社に関しては、電話番号、住所、郵便番号などの情報もデータベースに格納する必要があります。この場合、すべての情報を Titles テーブルに格納するように設計すると、同じ出版社の書籍のレコードには、電話番号が重複して登録されます。
この問題を解決するには、出版社情報を Publishers という名前の別のテーブルにまとめて格納して、Titles テーブルから Publishers テーブルのエントリを参照するように設計します。
Titles テーブルのデータと Publishers テーブルのデータを常に同期させるには、この 2 つのテーブルの間のリレーションシップに参照整合性を適用します。リレーションシップに参照整合性を適用することにより、あるテーブルの情報を別のテーブルの情報と確実に同期させることができます。たとえば、Titles テーブル内の各タイトルは、Publishers テーブル内の特定の出版社に関連付ける必要があります。この場合、データベースに登録されていない出版社については、その書籍のタイトルをデータベースに追加することはできません。
テーブル リレーションシップの種類
リレーションシップでは、2 つのテーブルのキー列 (通常は両方のテーブルの間で名前が共通の列) のデータを互いに関連付けます。ほとんどの場合、一方のテーブルの主キーをもう一方のテーブルの外部キーに関連付けます。なお、主キーでは、それぞれの行に固有の識別子が割り当てられます。たとえば、Titles テーブルの title_id 列 (主キー) と Sales テーブルの title_id 列 (外部キー) の間にリレーションシップを作成することによって、特定のタイトルに売上を関連付けることができます。
テーブル間のリレーションシップには 3 つの種類があります。作成したリレーションシップがどの種類になるかは、関連する列がどのように定義されているかによって決まります。
一対多リレーションシップ
一対多リレーションシップは、最も多用されるリレーションシップです。このリレーションシップでは、テーブル A の行は、テーブル B の複数の行に対応します。ただし、テーブル B の各行は、テーブル A の 1 つの行にのみ対応します。たとえば、Publishers テーブルと Titles テーブルの間には、一対多リレーションシップを設定します。これは、各出版社は多数のタイトルの書籍を出版しますが、各タイトルの書籍は 1 社の出版社からのみ出版されるからです。
一対多リレーションシップが作成されるのは、2 つの列のうちのどちらか一方のみが主キーとして定義されているか、または UNIQUE 制約を割り当てられている場合です。
Access では、一対多リレーションシップの主キー側は、キー記号で表されます。リレーションシップの外部キー側は、無限大記号で表されます。
多対多リレーションシップ
多対多リレーションシップでは、テーブル A の各行はテーブル B の複数の行に対応し、テーブル B の各行はテーブル A の複数の行に対応します。多対多リレーションシップを作成するには、交差テーブル (junction table。"結合テーブル" とも呼ばれます。) と呼ばれる第 3 のテーブルを定義します。交差テーブルの主キーは、テーブル A およびテーブル B の両方の外部キーに対応します。たとえば、Authors テーブルと Titles テーブルの間に多対多リレーションシップを作成するには、各テーブルから TitleAuthors テーブルの間に一対多リレーションシップを作成します。TitleAuthors テーブルの主キーは、au_id 列 (Authors テーブルの主キー) および title_id 列 (Titles テーブルの主キー) を組み合わせたものです。
一対一リレーションシップ
一対一リレーションシップでは、テーブル A の行はテーブル B の 1 つの行にしか対応しません。また、テーブル B の行もテーブル A の 1 つの行にしか対応しません。一対一リレーションシップを設定できるのは、2 つの列の両方が主キーとして定義されているか、または UNIQUE 制約を割り当てられている場合です。
一対一で対応するデータは本来 1 つのテーブルに格納できるため、一対一リレーションシップを使用することは通常はありません。一対一リレーションシップを使用するのは、以下のような特別な理由がある場合です。
-
列数が多いテーブルを分割する場合。
-
セキュリティ上の理由により、テーブルの一部分を隔離する必要がある場合。
-
ごく短期間だけ必要となるデータを格納する場合。このようなデータを別のテーブルに格納しておくと、そのテーブルを削除するだけで、これらのデータをすべて削除できます。
-
メイン テーブルのサブセットにのみ適用する情報を格納する場合。
Access では、一対一リレーションシップの主キー側はキー記号で表されます。また、外部キー側もキー記号で表されます。
テーブル間のリレーションシップを定義する方法
テーブル間のリレーションシップを作成する際に、関連付けるフィールドが同じ名前である必要はありませんが、主キー フィールドがオートナンバー型フィールドである場合を除き、同じデータ型のフィールドである必要があります。オートナンバー型フィールドと数値型フィールドを関連付けることができるのは、両者の "FieldSize/フィールドサイズ" プロパティが同じである場合のみです。たとえば、オートナンバー型フィールドおよび数値型フィールドで、両者の "FieldSize/フィールドサイズ" プロパティに [長整数型] が設定されている場合、オートナンバー型フィールドと数値型フィールドを関連付けることができます。数値型フィールドどうしを関連付ける場合であっても、"FieldSize/フィールドサイズ" プロパティの設定が一致している必要があります。
一対多または一対一のリレーションシップを定義する方法
一対多リレーションシップまたは一対一リレーションシップを作成するには、以下の手順を実行します。
-
開いているテーブルをすべて閉じます。開いているテーブル間のリレーションシップを作成することや変更することはできません。
-
Access 2002 または Access 2003 では、以下の手順を実行します。
-
F11 キーを押して、データベース ウィンドウに切り替えます。
-
[ツール] メニューの [リレーションシップ] をクリックします。
Access 2007 では、[データベース ツール] タブの [表示/非表示] の [リレーションシップ] をクリックします。
-
データベースで初めてリレーションシップを設定する場合は、[テーブルの表示] ダイアログ ボックスが自動的に表示されます。前回リレーションシップの設定を保存した場合は、このダイアログ ボックスは表示されません。その場合に関連付けるテーブルを追加するには、[リレーションシップ] メニューの [テーブルの表示] をクリックします (Access 2007 では、[デザイン] タブの [リレーションシップ] で [テーブルの表示] をクリックします)。
-
関連付けるテーブルの名前をダブルクリックし、[テーブルの表示] ダイアログ ボックスを閉じます。あるテーブルとそれ自体との間のリレーションシップを作成するには、そのテーブルを 2 回追加します。
-
一方のテーブルの関連付けるフィールドを、もう一方のテーブルの関連付けられるフィールドにドラッグします。複数のフィールドをドラッグするには、Ctrl キーを押しながら各フィールドをクリックして、複数のフィールドをドラッグします。
ほとんどの場合、あるテーブルの主キー フィールド (太字テキストで表示されます) から、別のテーブルの外部キーと呼ばれる同様のフィールド (通常は同じ名前です) にドラッグします。
-
[リレーションシップ] ダイアログ ボックスが表示されます。2 つの列に表示されているフィールド名が正しいかどうかを確認します。必要に応じて、フィールド名を変更します。
必要に応じてリレーションシップのオプションを設定します。[リレーションシップ] ダイアログ ボックスで特定の項目についての情報が必要な場合は、[?] ボタンをクリックし、対象となる項目をクリックします。これらのオプションについては、この資料の後半で説明します。
-
[作成] をクリックして、リレーションシップを作成します。
-
関連付けるテーブルの組み合わせごとに、手順 5. 〜 8. を実行します。
[リレーションシップ] ダイアログ ボックスを閉じるときに (Access 2007 では、[リレーションシップ] タブを閉じるか、[デザイン] タブの [リレーションシップ] で [閉じる] をクリックしたときに)、レイアウトを保存するかどうかを確認するメッセージが表示されます。レイアウトの変更を保存するかどうかにかかわらず、作成されたリレーションシップはデータベースに保存されます。
注 : テーブルと同じようにクエリを使用してリレーションシップを作成することができます。ただし、クエリを使用した場合は、参照整合性は設定されません。
多対多リレーションシップを定義する方法
多対多リレーションシップを作成するには、以下の手順を実行します。
-
多対多リレーションシップを設定する 2 つのテーブルを作成します。
-
交差テーブルと呼ばれる第 3 のテーブルを作成し、多対多リレーションシップを設定する 2 つのテーブルの主キー フィールドと同じ定義を持つ新しいフィールドを交差テーブルに追加します。交差テーブルでは、主キー フィールドは外部キーの役割を果たします。他のテーブルと同様に、この交差テーブルにもフィールドを追加することができます。
-
交差テーブルで、リレーションシップを作成する 2 つのテーブルのすべての主キー フィールドを含むように、主キーを設定します。たとえば、交差テーブル TitleAuthors の場合、主キーは OrderID フィールドおよび ProductID フィールドから構成されます。
注 : 主キーを作成するには、以下の手順を実行します。
-
テーブルをデザイン ビューで開きます。
-
主キーとして定義する 1 つまたは複数のフィールドを選択します。1 つのフィールドを選択するには、目的のフィールドの行セレクタをクリックします。
複数のフィールドを選択するには、Ctrl キーを押しながら各フィールドの行セレクタをクリックします。
-
Access 2002 または Access 2003 では、ツール バーの [主キー] をクリックします。
Access 2007 では、[デザイン] タブの [ツール] の [主キー] をクリックします。
注 : テーブルでの並びと異なる順序を、複数の主キー フィールドに指定するには、ツール バーの [インデックス] をクリックして (Access 2007 では、[デザイン] タブの [表示/非表示] の [インデックス] をクリックして)、[インデックス] ダイアログ ボックスを表示します。次に、PrimaryKey という名前のインデックスのフィールド名の並べ替え順序を変更します。
-
2 つの主テーブルそれぞれと交差テーブルとの間で一対多リレーションシップを定義します。
参照整合性
参照整合性とは、Microsoft Access が一連のルールを使用して、関連テーブルのレコード間のリレーションシップが有効であること、および関連データが誤って削除または変更されていないことを保証する機能です。参照整合性を設定できるのは、以下の条件がすべて満たされている場合です。
-
主テーブルのフィールドが主キーとして定義されているか、または一意のインデックスを持っていること。
-
関連付けられるフィールドのデータ型が同じであること。ただし、例外が 2 つあります。つまり、オートナンバー型フィールドおよび数値型フィールドで、両者の "FieldSize/フィールドサイズ" プロパティに [長整数型] が設定されている場合は、オートナンバー型フィールドと数値型フィールドを関連付けることができます。また、"FieldSize/フィールドサイズ" プロパティが [レプリケーション ID 型] に設定されているオートナンバー型フィールドは、同じく "FieldSize/フィールドサイズ" プロパティが [レプリケーション ID 型] に設定されている数値型フィールドに関連付けることができます。
-
2 つのテーブルが両方とも同じ Microsoft Access データベースに属していること。これらのテーブルがリンク テーブルである場合は、Microsoft Access 形式のテーブルである必要があります。また、これらのテーブルが格納されているデータベースを開いて、参照整合性を設定する必要があります。他の形式のデータベースからリンク テーブルに参照整合性を適用することはできません。
参照整合性を使用する場合は、以下の規則が適用されます。
-
主テーブルの主キーに存在しない値を関連テーブルの外部キー フィールドに入力することはできません。ただし、外部キーに Null 値を入力し、レコードの関連性がないことを示すことができます。たとえば、存在しない得意先に割り当てられた受注伝票を作成することはできませんが、"得意先コード" フィールドに Null 値を入力することにより、だれにも割り当てられていない受注伝票を作成することができます。
-
主テーブルのレコードに対応するレコードが関連テーブルに存在する場合、主テーブルからそのレコードを削除することはできません。たとえば、ある社員に割り当てられた受注伝票が "受注" テーブルにある場合、"社員" テーブルからその社員レコードを削除することはできません。
-
レコードに関連レコードがある場合、主テーブルの主キーの値を変更することはできません。たとえば、ある社員に割り当てられた受注伝票が "受注" テーブルにある場合、"社員" テーブルにあるその社員の社員 ID を変更することはできません。
連鎖更新および連鎖削除
参照整合性が適用されたリレーションシップでは、関連レコードの連鎖更新または連鎖削除を自動的に実行するかどうかを指定することができます。これらのオプションを設定すると、参照整合性ルールによって通常は許可されない削除処理や更新処理が許可されます。主テーブルのレコードを削除するか、主キーの値を変更すると、参照整合性を維持するため、必要な変更が関連テーブルに自動的に適用されます。
リレーションシップを定義する際に [フィールドの連鎖更新] チェック ボックスをオンにした場合、主テーブルのレコードの主キーを変更すると常に、すべての関連レコードで自動的に主キーが新しい値に更新されます。たとえば、"得意先" テーブルで得意先コードを変更すると、リレーションシップが維持されるように、その得意先のすべての受注伝票で "受注" テーブルの "得意先コード" フィールドが自動的に更新されます。連鎖更新の実行時にメッセージは表示されません。
注 : 主テーブルの主キーがオートナンバー型フィールドの場合、オートナンバー型フィールドの値は変更できないため、[フィールドの連鎖更新] チェック ボックスをオンにしても効果はありません。
リレーションシップを定義するときに、[レコードの連鎖削除] チェック ボックスをオンにすると、主テーブルのレコードを削除するたびに必ず、関連テーブルの対応するレコードの値が自動的に削除されます。たとえば、"得意先" テーブルの "得意先名" レコードを削除すると、"受注" テーブルからその得意先のすべての受注内容が自動的に削除されます。削除対象には、受注レコードに関連付けられている "受注明細" テーブルのレコードも含まれます。[レコードの連鎖削除] チェック ボックスをオンにして、フォームまたはデータシートからレコードを削除すると、関連するテーブルの対応するレコードも削除されるという警告メッセージが表示されます。ただし、削除クエリを使用してレコードを削除すると、警告メッセージは表示されずに、関連するテーブルの対応するレコードが自動的に削除されます。
結合の種類
以下のように 3 種類の結合があります。
オプション [1] は、内部結合を定義します。内部結合では、結合フィールドの値が指定した条件を満たす場合にのみ、2 つのテーブルのレコードが組み合わせられてクエリの結果に追加されます。クエリでは、デフォルトで内部結合が実行され、結合フィールドの値が一致する場合にのみ、レコードが選択されます。
オプション [2] は、左外部結合を定義します。左外部結合では、クエリの SQL ステートメントで LEFT JOIN 操作の左側に指定したすべてのレコードが、右側のテーブルの結合フィールドに一致する値がない場合でも、クエリの結果に追加されます。
オプション [3] は、右外部結合を定義します。右外部結合では、クエリの SQL ステートメントで RIGHT JOIN 操作の右側に指定したすべてのレコードが、左側のテーブルの結合フィールドに一致する値がない場合でも、クエリの結果に追加されます。
文書番号: 304466 - 最終更新日: 2013年4月15日 - リビジョン: 5.2
この資料は以下の製品について記述したものです。
- Microsoft Office Access 2007
- Microsoft Office Access 2003
- Microsoft Access 2002 Standard Edition
| kbdesign kbdatabase kbhowto KB304466 |
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。