どこかでテーブルの主キーについて質問しているのを見かけました。
意外に分かられてない方が多いようだったので、返事をしようと思ったら登録しないと返事も出来なかったので、返事をするのをやめました。
そんな方の為に、主キーについてちょっと書いてみようと思います。
データベースには、「キー」というものが必要となります。
その「キー」は、テーブルとテーブルを繋ぐためのもので、データの管理を容易にする為の物なのですが、繋ぐと言う事は、キーの重複は許されないと言うことになります。
たとえば、
伝票テーブル | 明細テーブル | 顧客テーブル | |||
■■ | 伝票№ | ■■ | 伝票№ | ■■ | 顧客№ |
顧客№ | 明細№ | 顧客名 | |||
伝票日付 | 商品№ | 住所 | |||
備考 | 数量 | 電話番号 | |||
担当者名 |
というテーブルを作る場合、このままでは、「主キーが設定されていません」と言うメッセージと共に、主キーの設定を促され、[はい]を選ぶと、IDと言う名前のオートナンバー型の項目が追加されます。
ですが、このテーブルの場合、例えば「伝票テーブル」ですが、伝票№という一つのレコードを管理するための項目がすでに用意されています。
これを主キーにすれば良いので、[キャンセル]を選び、伝票№を主キーに設定しなおせば、前述のメッセージは表示されなくなります。(この場合、重複不可となります)
次に「明細テーブル」ですが、此処には3つの№があります。明細№だけをキーにしてしまうことも出来るのですがそうすると重複が許されず、伝票単位では1件目のデータも100等と言った数値になってしまいます。(1項目のみでの主キー設定は重複不可が原則となる為)
出来れば明細№を1から振って帳票に出力したいところですね。
そういう場合は、伝票№と明細№の二つを選択してから主キー設定を行います。そうすると、それぞれの項目は重複を許されますが、二つセットで見た場合重複不可となります。
ちなみに、商品№は他に商品テーブル(商品名や価格情報を保有させる)を用意して、商品テーブルで主キー設定を行いフォームやレポートで活用します。(入力を容易にするためのものです)
そして、最後に顧客テーブルですが、これは顧客№を主キーに設定し、伝票テーブルで呼び出しを行います。
その為顧客№の重複は不可となります。
営業所が複数ある。とか、複数の担当者を管理したいと言う場合もあると思いますが、顧客テーブルで複数キーで管理するのは得策ではありません。
顧客名のみ同じである場合は、別№で顧客登録を行い、担当者が複数名いて、担当者1、担当者2としていくのはちょっと……と言う場合は、担当者テーブル(顧客№、担当者№、担当者名のような感じで)を作成し、担当者名を削除します。
そして、顧客№、担当者№の二つで主キーを作成し、顧客テーブルとは顧客№でリンクさせます。
伝票テーブル | 明細テーブル | 顧客テーブル | |||
主キー | 伝票№ | 主キー | 明細№ | 主キー | 顧客№ |
顧客№ | 伝票№ | 顧客名 | |||
伝票日付 | 商品№ | 住所 | |||
備考 | 数量 | 電話番号 | |||
担当者名 |
こうしていけば、主キーはオートナンバーの必要はありませんが、伝票№などは自動的に連番がついてくれると管理が楽なのでオートナンバーを活用し、明細№は自分で数値を入れる必要が出てきます。
また、顧客テーブルなどは顧客№を使わずとも、顧客名を主キーにすることも可能ですが、データ入力等を考慮すると数値の方が扱いやすいかと思います。
ちなみに、伝票テーブルの場合、キー(他のテーブルとリンクさせるもの)は[伝票№]と[顧客№]になりますが、伝票テーブルのそれぞれのレコードを単一のものとして管理するためのキーは、[伝票№]となり、主キーが[伝票№]となるわけです。
説明が下手なので、分かりにくかったかもしれません
コメントを書いていただければ、追加で説明を記入したりもすると思います