Accessのリレーションシップについてお探しですね。
広告
Accessのリレーションシップを初心者向けに解説|一対多の作り方と設定できない時の対処法
Accessで複数のテーブルを使い始めると、「リレーションシップ」「一対多」「参照整合性」といった専門用語が次々と出てきて、混乱してしまいますよね。
特にExcelで1枚の表にすべて書き込んでいた人にとって、「わざわざテーブルを分けて、それをつなぐ」という考え方は最初の大きなハードルになります。
この記事では、Accessのリレーションシップって何なのか、一対多の関係をどうやって作るのか、うまく設定できない時はどうすればいいのかを、図を使いながらわかりやすく説明していきます。
1. Accessのリレーションシップって何?テーブル同士をつなぐ仕組み
Accessのリレーションシップとは、バラバラに保存した複数のテーブルを、共通の項目を使って関連付ける仕組みのことです。
例えば「顧客テーブル」と「売上テーブル」があるとします。
どちらにも「顧客ID」という項目を入れておけば、「この売上データはどのお客さんのものか」をAccessが自動で判断できるようになるんです。
Excelだと、顧客名・住所・商品名・売上金額などを全部1つの表にまとめて入力しがちですよね。
でもその方法だと、同じお客さんの情報を何度も入力することになって、修正漏れや入力ミスが起こりやすくなってしまいます。
Accessでは、データを役割ごとに別々のテーブルに分けて、必要な時だけリレーションシップでつなぐことで、正確で管理しやすいデータベースが作れます。
図で表すと、こんなイメージです。
“`text
顧客テーブル 売上テーブル
顧客ID(主キー) 1 ─────── ∞ 顧客ID(外部キー)
顧客名 売上ID
住所 売上日
電話番号 金額
“`
左側の「顧客テーブル」では、顧客IDは1人のお客さんを特定するための主キーです。
一方、右側の「売上テーブル」では、同じお客さんが何回も買い物をする可能性があるので、顧客IDが何度も出てきます。
このように、片方では値が1回だけ、もう片方では何回も使われる関係を「一対多」と呼びます。
Accessのリレーションシップ画面では、一側に「1」、多側に「∞」が表示されるので、どちらが親テーブルでどちらが子テーブルかが一目でわかります。
リレーションシップを設定する目的は、単にテーブルを線でつなぐことではありません。
正しくつなぐことで、こんなことができるようになります。
– クエリで複数テーブルの情報をまとめて表示できる
– フォームで関連データを簡単に扱える
– 存在しない顧客IDを売上テーブルに入力できないようにする
特に「参照整合性」を有効にすると、親テーブルに存在しない値を子テーブルに登録できなくなるので、おかしなデータが入るのを防げます。
Accessを安定して使うには、リレーションシップを「見た目の線」ではなく「データのルール」として理解することが大切です。
2. 一対多リレーションシップの作り方を図解で理解しよう
Accessで一対多リレーションシップを作るには、まず親になるテーブルに主キーを設定して、子になるテーブルに対応する外部キーを用意します。
例えば「商品テーブル」と「売上明細テーブル」をつなぐ場合を考えてみましょう。
商品テーブルの「商品ID」は重複しない主キーにします。
一方、売上明細テーブルの「商品ID」は、同じ商品が何度も売れる可能性があるので重複OKにします。
この主キーと外部キーを結ぶことで、「1つの商品に対して複数の売上明細が存在する」という関係をAccessに伝えられるわけです。
ここで大事なポイントがあります。
両方のフィールド名が完全に同じである必要はありませんが、**データ型やフィールドサイズは一致している必要があります**。
実際の操作手順を見ていきましょう。
Accessの「データベースツール」タブから「リレーションシップ」を開きます。
リレーションシップ画面に対象のテーブルを追加して、親テーブルの主キーフィールドを子テーブルの外部キーフィールドへドラッグします。
すると「リレーションシップ」ダイアログが表示されるので、つなぐフィールドが正しいか確認して、必要なら「参照整合性」にチェックを入れて作成します。
参照整合性を有効にできた場合、線の一方に「1」、もう一方に「∞」が表示されて、一対多の関係ができたことがわかります。
基本の流れをまとめると、こうなります。
– 親テーブルに重複しない主キーを設定する
– 子テーブルに同じ意味を持つ外部キーを作る
– リレーションシップ画面で主キーから外部キーへドラッグする
– フィールドの対応を確認して、必要なら参照整合性を有効にする
– 「1」と「∞」が表示されているか確認する
ここで注意したいのは、「一対多」はAccessが勝手に判断しているわけではなく、インデックス設定とデータの状態によって決まるということです。
親側のフィールドは主キー、または「インデックス:はい(重複なし)」になっている必要があります。
多側のフィールドは重複してもいいので、「インデックス:いいえ」または「はい(重複あり)」にします。
両方が重複なしになっていると一対一になってしまい、両方に重複があると参照整合性を伴う一対多を作れない場合があります。
うまく「1」と「∞」が表示されない時は、まずインデックスの設定を確認してみてください。
3. 参照整合性・連鎖更新・連鎖削除って何?注意点も解説
Accessのリレーションシップ作成画面には、「参照整合性」「フィールドの連鎖更新」「レコードの連鎖削除」というチェック項目があります。
初心者の方は、全部チェックしていいのか迷いますよね。
それぞれの意味を理解してから使うことが大切です。
参照整合性とは
参照整合性は、子テーブルに入力される外部キーの値が、親テーブルに存在することを保証する機能です。
例えば、顧客テーブルに存在しない顧客ID「999」を売上テーブルへ入力しようとすると、Accessがエラーを出して登録を防いでくれます。
図で見ると、こんな感じです。
“`text
参照整合性あり
顧客テーブル
顧客ID:C001
顧客ID:C002
売上テーブル
顧客ID:C001 → 登録できる
顧客ID:C999 → 親に存在しないため登録できない
“`
参照整合性は、「子テーブルが必ず実在する親を参照する」ための安全装置なんです。
データベースでは、親が存在しない子レコードを「孤立したレコード」と呼びます。
孤立したレコードが増えると、こんな問題が起こります。
– クエリで集計した時に件数が合わない
– フォームで名称が表示されない
– 削除や更新でエラーが出る
Accessで業務データを長く使うなら、できる限り参照整合性を有効にして、例外的に未入力を許可する項目だけ調整する考え方が安全です。
連鎖更新とは
連鎖更新は、親テーブルの主キー値を変更した時に、子テーブル側の外部キーも自動で更新する設定です。
例えば顧客ID「C001」を「C100」に変更した場合、売上テーブル内の該当する顧客IDもまとめて変更されます。
ただし、主キーは本来あまり変更しない設計が望ましいので、連鎖更新は「コード体系を後から変更する可能性がある」場合に限定して検討するといいでしょう。
レコードの連鎖削除とは
レコードの連鎖削除は、親テーブルのレコードを削除した時に、関連する子テーブルのレコードもまとめて削除する機能です。
便利そうに見えますが、顧客を削除しただけで過去の売上履歴まで消えてしまう可能性があるので、業務データでは慎重に扱う必要があります。
リレーションシップとクエリの結合の違い
リレーションシップとクエリの「結合の種類」は似ていますが、役割が少し違います。
リレーションシップはテーブル間の基本的な関連ルールで、結合の種類はクエリでどのレコードを表示するかに影響します。
標準の内部結合では、両方のテーブルに一致する値があるレコードだけが表示されます。
「売上はすべて表示したいけど、該当するマスタがない場合は空欄でもいい」というケースでは、左外部結合や右外部結合を選ぶことがあります。
データを守る設定と、表示結果を調整する設定を分けて考えると、Accessの動きが理解しやすくなりますよ。
4. Accessリレーションシップができない時の原因と対処法
Accessでリレーションシップを作ろうとしても、「参照整合性を設定できない」「一対多にならない」「エラーが出て作成できない」ということがあります。
多くの場合、原因は次のどれかです。
– フィールドのデータ型が合っていない
– インデックスの設定が間違っている
– 既存データに不整合がある
– テーブルを開いたまま編集している
データ型が合っていない
例えば、親テーブルの主キーがオートナンバー型なのに、子テーブルの外部キーが短いテキスト型になっていると、同じIDに見えてもAccess上は別の種類の値として扱われます。
オートナンバー型の主キーに対応させる外部キーは、通常「数値型」でフィールドサイズを「長整数型」にします。
確認すべきポイント
特に確認すべきポイントは次の通りです。
– 親側フィールドが主キー、または重複なしのインデックスになっているか
– 子側フィールドが重複を許可する設定になっているか
– 両フィールドのデータ型とフィールドサイズが一致しているか
– 子テーブルに、親テーブルに存在しない値が入っていないか
– 対象テーブルを開いたまま編集していないか
既存データに不整合がある場合
参照整合性を有効にできない場合は、既存データに不整合があるケースがよくあります。
例えば売上テーブルに顧客ID「C010」が入っているのに、顧客テーブルに「C010」が存在しない場合、Accessは参照整合性を設定できません。
この場合は、不一致クエリを使って子テーブル側の孤立データを探して、正しい親データを追加するか、子テーブルの値を修正する必要があります。
単にチェックを外してリレーションシップを作ることもできますが、根本原因を放置すると後で集計やフォーム表示のトラブルにつながるので注意してください。
一対多ではなく一対一になってしまう場合
一対多ではなく一対一になってしまう場合は、多側の外部キーフィールドに「重複なし」のインデックスが設定されている可能性があります。
売上テーブルや明細テーブルでは、同じ顧客IDや商品IDが複数回登場するのが自然です。
そのため、多側のインデックスは「はい(重複あり)」または「いいえ」に変更しましょう。
逆に親側に重複がある場合は、Accessが「どの親レコードに結び付ければいいか」を判断できないため、一対多の親として使えません。
親テーブルではIDの重複を削除して、主キーを設定してからリレーションシップを作成してください。
多対多の関係を直接つなごうとしている場合
多対多の関係を直接つなごうとして失敗することもあります。
例えば「社員」と「プロジェクト」は、1人の社員が複数プロジェクトに参加するし、1つのプロジェクトにも複数社員が参加するので、多対多の関係です。
Accessの実務設計では、この2つを直接つなぐのではなく、「社員プロジェクト」などの中間テーブルを作って、一対多を2本に分解します。
図で表すと、こうなります。
“`text
社員テーブル 社員プロジェクトテーブル プロジェクトテーブル
社員ID 1 ─── ∞ 社員ID
プロジェクトID ∞ ─── 1 プロジェクトID
“`
この中間テーブルを使う考え方は、Accessだけでなくリレーショナルデータベース全般で重要です。
多対多を無理に1つのテーブルで管理すると、同じ情報の繰り返しが増えて、更新漏れや重複登録の原因になります。
リレーションシップがうまく作れない時は、「本当に一対多で表現できる関係か」「中間テーブルが必要じゃないか」を見直すと解決することがあります。
Accessのリレーションシップは、操作手順だけでなくテーブル設計の考え方とセットで理解することで、安定したデータベース作成につながります。
最初は難しく感じるかもしれませんが、一つずつ確認していけば必ずできるようになりますよ。
広告
