主キーとは

主キーとは、テーブル内のレコードを識別するためのフィールドです。以下の条件に当てはまるフィールドを主キーに選びます。

キーの役割・メリット

新しいテーブルに主キーを設定しないで保存しようとすると、
「主キーが設定されていません。」という内容のダイアログボックスが表示されます。
主キーを設定すると、並べ替えが高速になる、他のテーブルと連携できるというメリットがあります。
「主キーが設定されていません。」という内容のダイアログボックスで[はい]ボタンをクリックすると、
「ID」という名前のオートナンバー型のフィールドが自動的に追加され、そのフィールドが主キーに設定されます。

主キーの設定

テーブルのデザインビューでフィールド名と型を設定したあと、主キーに設定するフィールド名の左横のグレーの帯部分に
マウスカーソルを持って行くと右向き矢印アイコンに変わります。
そこで左ボタンを押すとフィールドが選択されます。
ここで主キーボタンを押すとグレーの帯部分に小さい鍵アイコンが表示され、主キーに設定されたことが分かります。

「見積テーブル」と「見積明細テーブル」を分ける理由(正規化)

ダウンロードした「見積書.xlsx」を開いてみてください。
『1枚に1つしかない情報』と、『何行も書ける情報』の2種類が混ざっていることが分かります。

もしこれを分けずに1つのテーブル(エクセルのような1シート)にまとめたものが、「見積元データ.xlsx」の「見積書(1行)」シートになります。 見て分かるように、3行の商品を見積もるだけで、同じ『顧客名』や『日付』を3回も繰り返し書く羽目になりますし、空白セルも無駄になります。
これではデータが無駄に膨らむだけでなく、打ち間違いの原因にもなります。だから、分ける必要があるのです。

テーブルの正規化

分けない場合(エクセル風)のデメリット 分けた場合(データベース)のメリット
データ容量 データの無駄づかい
同じ見積番号、顧客名、日付が
何行にもわたって何度も繰り返し保存される。
すっきり保存(容量削減)
共通情報は1回だけ保存し、
明細は必要な行数だけ作るので無駄がない。
データ修正 修正ミスが起きる
見積日付を「10月1日」から「10月2日」に変えるとき、
全ての行を漏れなく書き直さないとデータが矛盾する。
修正が1箇所で済む
見積テーブルの日付を1箇所変えるだけで、
紐づくすべての明細に一発で反映される。
データ集計 計算が狂う
見積の「合計金額」を同じ行に書いてしまうと、
エクセルで合計を出すときに重複して集計されてしまう。
集計が正確
合計金額は明細の金額を足すだけで
いつでも正確に計算できる。
ものように、1枚の見積書(1)に対して、商品の行(多)はいくつでも増える可能性がある関係を
「1対多(いちたいたい)の関係」と言います。

複数のフィールドを主キーに設定する

いままで作成したテーブルはすべて1つの主キーフィールドが設定されていました。
しかし「見積明細」テーブルには2つの主キーフィールドが設定されています。なぜでしょうか?
「見積ID」には複数の商品の明細行がにも付いています。そのため、「見積ID」には同じ値が入る場合があります。
これでは主キーの要件に当てはまりません。
「商品ID」も、複数の顧客が同じ商品を見積依頼する場合があるので、これも主キーの要件を満たしません。
しかし、1つの見積書には同じ商品の行が1回しか現れないとすればどうでしょうか。
「見積ID」と「商品ID」を組み合わせると、主キーの要件を満たすことが分かります。

複数に渡る主キーを設定する方法

複合キー(複合主キー)

1つの列だけではレコードを一意に識別できない場合に、2つ以上の列を組み合わせて設定する主キー。

これまで主キーを設定した方法で2つのフィールドを主キーに設定しようとすると、1つめのフィールドは主キーに設定できますが、
2つめのフィールドを主キーに設定しようとすると、主キーボタンを押したとたんに先に設定していた主キーの鍵アイコンが消え、
今選択したフィールドだけに鍵アイコンがついてしまいます。
複数のフィールドを組み合わせて主キーに設定するには以下のようにします。
まず、1つめのフィールド行を選択した後、キーボードの[Ctlr]キーを押したまま2つめのフィールドを選択します。
(連続したフィールドを複数選択する場合は、最初の主キーのフィールド名の左のグレーの帯の上で
マウス左ボタンを押したまま下にドラッグすると複数のフィールドが選択されます。)
複数のフィールドを選択
この状態で主キーボタンを押すと、選択したフィールドすべてに鍵アイコンがつきます。

リレーションシップとは

テーブルの作成が出来れば、次にリレーションシップを設定します。
リレーションシップは、主キーまたは各行の一意識別子列を、あるテーブルから別のテーブルのフィールドに接続して
関係性を定義することです。呼び出す側のテーブルの列は「外部キー」と呼ばれます。
この「外部キー」は複数現れても問題ありません。
[データベースツール]タブの[リレーションシップ]ボタンを押します。
[リレーションシップ]ボタン
すると、テーブル・クエリの選択ウィンドが表示されますので、必要なテーブルをすべて選択して追加します。
一つずつ追加することも出来ますが、複数選択して1度に追加する方が効率的です。
複数選択する場合は、選択する最初のテーブル名をクリックして選択した後、[Shift]キーを押しながら最後のテーブル名をクリックする。
飛び飛びの項目を選択するには、 [Ctrl]キーを押したまま、テーブル名をクリックして選択する。
テーブル・クエリの選択
このウィンドは、テーブルを追加しても自動的には閉じないので、追加が終われば右上の閉じるボタンで閉じておきます。
これで画面上に選択したテーブルの構造が表示されます。
次に、関連付けたいフィールドの片方(「主キー」、「外部キー」のいずれでも可)の上にマウスカーソルを置き、
マウスボタンを押したままドラッグして、関連付けるテーブルのフィールドの上にドロップします。

ドロップするとウィンドが表示されるので、[OK]を押すとウインドが閉じます。

リレーションシップの画面上には2つのフィールドが線で結ばれます。

参照整合性とは

ここで気づかれた方もいらっしゃるでしょうが、配布した資料では線の両側に[1]や[∞]マークがついているのに、
今設定したリレーション図には線だけしか描かれていません。
これは、1対多を表すマークで、[参照整合性]を設定したときに表示されます。
参照整合性にチェック
先ほどリレーションを設定したフィールド名の下にチェックボックスが並んでいます。
その[参照整合性]にチェックを入れて[OK]を押すと[1][∞]マークが表示されます。

「参照整合性」にチェックすると、[外部キー]のフィールドには「主キー」に入力済みである値しか入力できないようになります。
これによりデータの整合性を保ち、矛盾のないデータ管理を行うことができるようになります。