Accessでは、参照整合性を設定することで、データの入力や更新、削除が制限されてデータの整合性を保つことができます。
リレーションシップのダイアログボックスには[参照整合性]の設定のほかに、[フィールドの連鎖更新]と[レコードの連鎖削除]という項目があります。
これは、主テーブル側の主キーの更新や削除によって、関連テーブル側のデータも更新されたり、削除されるものです。
参考ここでは[タブ付きドキュメント](既定)の設定にしています。[ウィンドウを重ねて表示する]と[タブ付きドキュメント]の違いについては、以下の記事で解説しています。
-
[タブ付きドキュメント]と[ウィンドウを重ねて表示する]の違い
Access2007以降、オブジェクトを表示すると、タブ付きウィンドウで表示されるようになっています。 昔からAccessを使用している方に ...
リレーションシップと参照整合性
テーブル間で参照整合性の設定するには、テーブルに主キーを設定しておく必要があります。[主キー]とは、各レコードを固有のものとして識別するフィールドのことです。
主キーについては、以下の記事で解説しています。
-
Accessテーブルの[主キー]の設定
Accessのテーブルでは、[主キー](シュキー)を設定することができます。[主キー]とは、各レコードを固有のものとして識別するフィールドの ...
また、リレーションシップの設定をするには、共通フィールドがあって、データ型が同じであることが必要です。
共通フィールドの[主キー]側のテーブルを[主テーブル]、もう一方の[外部キー]があるテーブルを[関連テーブル]といいます。
リレーションシップと参照整合性については、以下の記事で解説しています。
-
リレーションシップの作成と参照整合性の設定
Accessでは、複数のテーブルがあって、そのテーブル間の共通フィールドを関連付けることができます。この関連付けのことを[リレーションシップ ...
ここでは、以下のような2つのテーブル間でリレーションシップを設定しています。
以下は、テーブル[T_売上管理]のデータシートビューです。
以下は、テーブル[T_商品一覧」のデータシートビューです。
リレーションシップは、[データベースツール]タブの[リレーションシップ]をクリックして設定します。
リレーションシップ
たとえばテーブルどうしでIDフィールドや名前フィールドが一致しなければならないなど、テーブル間のデータの関連付けを定義します。
以下のように[T_商品一覧]の[商品ID]と[T_売上管理]の[商品ID]でリレーションを作成をしています。
[主キー]がある[T_商品一覧]が主テーブル、[外部キー]を含むテーブルが[関連テーブル]となります。
2つのテーブルのデザインビューで見ると、以下のようになります。
参照リレーションシップは、印刷することができます。
-
リレーションシップの表示とレポートの作成
Accessで作成したテーブル間のリレーションシップは印刷しておくと、役立つことが多いです。 データベースの構成が複雑になればなるほど必要で ...
参照整合性を設定した場合の入力制限
[リレーションシップ]ウィンドウで、結合線をダブルクリックすると、[リレーションシップ]ダイアログボックスが表示されます。
[参照整合性]のチェックボックスをオンにします。
参照整合性を設定すると、以下のように結合線が太くなり、主テーブルの主キーに[1]、関連テーブルの外部キーに[∞]のマークが表示されます。
参考以下のメッセージが表示される場合は、テーブルが開かれています。テーブルは閉じてから設定します。
テーブル'T_商品一覧'は現在ほかのユーザーまたはプロセスで使用されているので、ロックできませんでした。
この参照整合性の設定ができないという場合は、以下の記事を参考に確認してくみてください。
-
リレーションシップの作成と参照整合性の設定
Accessでは、複数のテーブルがあって、そのテーブル間の共通フィールドを関連付けることができます。この関連付けのことを[リレーションシップ ...
参照整合性の確認
参照整合性の設定すると、データの入力や更新、削除が制限されます。
入力の制限
関連テーブル[T_売上管理]を開いて、新しいレコードを入力してみます。
[商品ID]に主テーブル[T_商品一覧]にはない値を入力して、次のレコードへ移動しようとすると、以下のメッセージが表示されます。
テーブル'T_商品一覧'にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更を行うことはできません。
主テーブル[T_商品一覧]に存在しない値は入力できません。
メッセージウィンドウの[OK]ボタンを押して、キーボードから[Esc]キーを押すと入力した内容は消えます。
参考参照整合性の設定をしていなくても、コンボボックスやリストボックスを使って、リストから選択させるようにして制御することもできます。
-
ルックアップウィザードでコンボボックスの設定(別のテーブルから値取得)
Accessのテーブルで、フィールドに入力する値をコンボボックスから選択する方法です。 コンボボックスとは、フィールドの値を入力する代わりに ...
コンボボックスのプロパティには、[入力チェック]という機能もあります。参照整合性の設定をしておくとプロパティで設定しなくても、データの整合性は維持できます。
参照整合性を設定したテーブルをコンボボックスのリストにした場合
-
コンボボックスにリスト以外の値が入力されないようにするには
テーブルやフォームでコンボボックスのリストから値を選択して入力するようにしていても、プロパティの[入力チェック]を[いいえ]に設定していると ...
更新の制限
関連テーブル[T_売上管理]で商品IDを主テーブル[T_商品一覧]にない値に変更すると、同じように以下のメッセージウィンドウが表示されます。
主テーブル[T_商品一覧]に存在しない商品IDへの変更はできません。
テーブル'T_商品一覧'にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更を行うことはできません。
メッセージウィンドウの[OK]ボタンを押して、キーボードから[Esc]キーを押すと元に戻ります。
削除の制限
主テーブル[T_ 商品一覧]で1つのレコードを削除しようとすると、以下のメッセージウィンドウが表示されます。
リレーションシップが設定されたレコードがテーブル'T_売上管理'にあるので、レコードの削除や変更を行うことはできません。
関連テーブルに存在する[商品ID]がある場合、主テーブルのレコードの削除はできません。
フィールドの連鎖更新
[リレーションシップ]ダイアログボックスの[フィールドの連鎖更新]のチェックボックスをオンに設定すると、主テーブルの主キーの更新が、関連テーブルにもすぐに反映されます。
この場合もテーブルを閉じておかないと、メッセージが表示されて設定できませんので気を付けてください。
主テーブル[T_商品一覧]で[商品ID]の値を変更します。商品ID[001]を[Y001]に変更します。
関連テーブルの[T_売上管理]の商品ID[001]の値が変更されます。
ただし、この設定をオンにしていると、間違って更新されてしまうこともあります。できれば、連鎖更新が必要な時にチェックをオンにされることをお勧めします。
レコードの連鎖削除
[リレーションシップ]ダイアログボックスの[レコードの連鎖削除]のチェックボックスをオンに設定すると、主テーブルでレコードを削除した場合、関連テーブルのレコードも削除されます。
この場合もテーブルを閉じておかないと、メッセージが表示されて設定できませんので気を付けてください。
主テーブル[T_商品一覧]で商品ID[Y001]のレコードを削除します。
レコードは、選択してキーボードから[Delete]キーを押しても削除できます。
関連テーブル[T_売上管理]を開くと、[Y001]のレコードがすべて削除されています。
この設定を常にオンにしていると、間違って削除されてしまうこともあります。できれば、連鎖削除が必要な時にチェックをオンにされることをお勧めします。
参考Accessでは、削除クエリを作成して抽出条件に合うレコードのみを削除したりすることもできます。
この場合も[レコードの連鎖削除]の設定が必要になります。
-
削除クエリの作成(すべてのレコード/条件を指定したレコード)
Accessでテーブルのすべてのレコードを削除するには、すべてのレコードを選択して削除する方法もありますが、削除クエリを作成して簡単に削除す ...
ルックアップウィザードでデータ整合性の設定
ルックアップフィールドをウィザードで作成すると、最後の設定ウィンドウに[データ整合性を有効にする]という項目があります。
この時に、チェックボックスをオンにすると、[連鎖削除]と[削除制限]という項目が有効になります。
既定ではオフになっていますが、[データ整合性を有効にする]のチェックボックスをオンにすると、自動的に参照整合性が設定されます。
また、[連鎖削除]をオンにすると、[リレーションシップ]ダイアログボックスの[レコードの連鎖削除]のチェックボックスがオンになり連鎖削除が有効になります。
ルックアップウィザードを使用すると、以下のようにコンボボックスのリストから値を選択できるようになります。
ルックアップウィザードについては、以下の記事で解説しています。
-
ルックアップウィザードでコンボボックスの設定(別のテーブルから値取得)
Accessのテーブルで、フィールドに入力する値をコンボボックスから選択する方法です。 コンボボックスとは、フィールドの値を入力する代わりに ...