memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

ACCESSでリレーションを張ったときに「未定義」になる原因がやっとわかった。。。情けない

2年生対象のデータベース演習という科目をサブとして担当しています。サブというのは授業計画などはメインの先生(講義科目も担当されている先生)にお任せして演習授業で学生指導などを行うという意味です。

授業ではRDBの基礎を学習しSQLの習得がメインとなっています。

メインの先生のお考えで、いきなりテーブル操作をSQLで勉強するより、テーブルを視覚的にあらわすACCESSを最初にやった方がよい、という方針で最初の3、4回程度でACCESSの初歩を学習します。

これまで5、6年くらい担当してきたのですが、他のOffice製品に比べるとACCESSは操作上の縛り(エラーが表示されて進めなくなるケース)があるのですが、前述のように学習のメインではないので、対処療法的なことで逃げてきました。

今年も後期から本科目がスタートし、本日、第2回目でACCESSの操作方法の基礎を演習したのですが、タイトルのような事例が発生しました。これは毎年、発生するのですが、どういうわけかこの原因を調べずにきました。

で、さきほど帰りの電車で調べてみたらわかったんですね。。。もっと早く調べればよかった。ごめんなさい。

2つのテーブル間でリレーションを張ったときに「未定義」と表示されることがあります。

ぐぐると対処方法がすぐに見つかります。

対処方法:インデックスを「はい(重複なし」」にしろ

でも、なぜ未定義になるかはなかなか見つかりませんでしたが、やっと以下を見つけました。

detail.chiebukuro.yahoo.co.jp

結合したフィールドの少なくともどちらか一方は主キーである必用があります。

なるほどです。

これでわかる方は以下を読む必要はありません。

以下の例で再現してみました。

f:id:ke_takahashi:20171002194200p:plain

IDを除くすべての項目は「短いテキスト型」です。

テーブル1のaとテーブル2のaをリンクすると以下のように「未定義」になります。

f:id:ke_takahashi:20171002194447p:plain

この状態で相互参照をチェックすると以下のエラーメッセージが表示されます。

f:id:ke_takahashi:20171002194948p:plain

このメッセージを何度みたことか。。。そのときになって思い出します。そのときは「インデックスなんて張ってないしなんでこんなメッセージが表示されるのかな?内部状態がおかしいのだろうか?」と思っていました。

でも、上記の知恵袋の回答をみればこのメッセージの意味もよくわかります。主キーに設定していない項目はデフォルトではインデックスは「いいえ」になります。当然ですね。。。主キーでない項目にインデックスを張る意味はありません。逆に、主キーに設定すると自動的にインデックスは「はい(重複なし)」に設定されます。

ですので、ぐぐったら出てくる対処療法の「インデックスはっとけ」というのは1つの手であって、主キーとして設定されていない項目であってもインデックスを「あり(重複なし)」としていればユニークな項目として認識されるため「一対多」になるわけですね。

上記の例のテーブル1のaとテーブル4のaの間にリレーションを張ると、「1対多」と表示されます。テーブル4のaは主キーなのでインデックスは「あり(重複なし)」です。これは当然うまく行きます。

では、なぜ主キーでもない項目間にリレーションを張ろうとするのか?一言で言えば、主キーを設定し忘れた項目間でリレーションを張ろうとした、が思いつきます。本当かどうかは実際に起きたときに確認してみないとわかりませんが。

あと、上記の例のテーブル1のaとテーブル3のaを結んだときにも「未定義」になります。テーブル3はa, b, cの複合キーなのですが、この場合、aのインデックスは「いいえ」となるためてす。複合キーでは単一項目にインデックスを貼っても意味ないですからね。。。当然の動作と思います。

ということで次週より明確な対応ができますね。。。すいません。