![]() |
| Microsoft Access はマイクロソフト社の商標です。 ガイドラインに基づきスクリーンショットを掲載させていただきます。 |
コンボボックスを使って他のテーブルを参照する列を設け、その列に何も入力せず次のレコードに進もうとすると「リレーションシップが設定されたレコードが必要なので、レコードの追加や変更を行うことはできません。」と警告が出て進めなくなる場合があります。ここでは、その警告が出る原因のうち、最もありがちな1つの例とその解決を示します。
![]() |
ここでは、書籍を管理するデータベースを作ることとします。「T_出版社」と「T_書籍」の2つのテーブルを作り、右のようにリレーションシップの設定をします。なお、「出版社コード」、「書籍コード」、「価格」は数値型、その他はテキスト型とします。
![]() |
また、「T_書籍」をソースとした書籍入力フォームを作り、出版社コードを格納するコンボボックスを設けます。出版社名を表示しながら実際には外部キーである出版社コードを格納することで入力を容易にします。
![]() |
そして、入力を進めたところ、出版社が不明の書籍があったので、後で調べることにしてとりあえず出版社の欄を空白にして次のレコードに進むことにします。
![]() |
| フォームを例にしてますが、テーブルでも起こり得ます。 |
するとこのような警告がでます。当然レコードの追加は許されません。このとき、エラーメッセージの内容のせいでつい「外部キーは参照整合性の制約があるからnullにできないのか。面倒だけど仕方がない。」などと納得してしまい、仕方なく他の出版社を入力しておいたり、「T_出版社」に「不明」といったダミーのレコードを設けて対応しまう場合があります。
しかし、(価格がない書籍や書籍名の無い書籍があってもおかしくないように)出版社がない書籍があってもおかしくない以上、nullでも受け入れられるのが自然でしょう。理屈から言っても、出版社コードは「T_書籍」の主キーではありませんので、nullとしたところで何の問題もないはずです。
![]() |
| この既定値が問題 |
ではなぜ警告が出るのかというと、「T_書籍」テーブルの「出版社コード」の既定値が「0」に設定されているためです。出版社コードを数値型に設定した時点で既定値が勝手に「0」と設定されるため、フォームのコンボボックスで出版社コードの値に何も入力しなかったつもり(たしかに見た目はnull)でも、テーブルの出版社コードの値は「0」となり、「T_出版社」テーブルと(出版社コードが0のデータがない限り)整合しないため上記の警告が出るのです。
よってこのときの解決は「T_書籍」の出版社コードの既定値をnullにすることです。なおフォームのコンボボックスの既定値は(はじめからnullであると思いますが)いじっても無駄です。