値要求と空文字列の許可の効果と注意点

 テーブルの列のプロパティとして「値要求」があり、必ず何らかの値を入力させる(Not Null制約)という場合は、「はい」に設定することで実現します。また、データ型がテキスト型であるときはプロパティに「空文字列の許可」が加わり、空文字列(長さ0の文字列)の可否についても設定することができます。
 一見なんということもありませんが、注意すべき点がありますので、ここで実例を挙げるとともに設定の詳細を整理してみます。

 ここでは例として右のようなテーブルを使います。説明上の必要のため「氏名文字数」という列を設け、データ型を「集計」に、式を「Len([氏名])」とします。これにより「氏名」列の文字数が常に表示されます。


 さて、「氏名」列の設定をみてみます。テキスト型になっていて、「値要求」は「いいえ」、「空文字列の許可」は「はい」となっています(ともにデフォルト値)。

 このテーブルに新しい行(レコード)を追加してみます。ただし、主キーである「会員番号」列のみ入力し「氏名」列には何も入力せず次のレコードに移ります。このとき、新しく追加した行の「氏名文字数」にも何も表示されません。当然ですが「氏名」の値がNullであるためです。


 新しく追加したレコードに戻って氏名を入力すると、やはり当然ですがその文字数が表示されます。


 その氏名を削除すると氏名がNullに戻り、文字数の表示は再度空白になります。


 さて、データを元に戻してテーブルデザインに戻り、「氏名」列の「値要求」を「はい」にしてみます。「空文字列の許可」は「はい」のままです。


 

 改めて新しいレコードを追加し、氏名になにも入力せず次のレコードに移ろうとすると、「値要求」の効果でエラーメッセージが現れます。


 ここからがポイントです。氏名に値を入力すると当然文字数が表示されますが…


 一度入力した値を削除したとき、文字数が空白にならず「0」となります。このとき氏名の値はNullではなく空文字列(長さ0の文字列)にされているのです。


 したがって他の行に移ってもエラーになりません。
 「値要求」を「はい」にするだけでも確実に(1文字以上の)値を入力させられるような気がするかもしれませんが、「空文字列の許可」が「はい」のままでは、このような仕様により空文字列が入力されることを防げません(もちろん、「""」と入力することによる空文字列の入力も防げません)。


 以上を踏まえて、「値要求」と「空文字列の許可」による4通りの設定について設定した場合の挙動を整理してみます。

「値要求」の設定「空文字列の許可」の設定Nullの可否空文字の可否行発生時の値文字列削除後の値
いいえはいNullNull
いいえいいえ×NullNull
はいはい×Null空文字列(長さ0の文字列)
はいいいえ××Null(削除不能)

 Nullと空文字の可否、行追加時の値については当然の結果ですが、文字列を削除した場合については「Nullが許可されている場合はNull、されていない場合は空文字列」となることがわかります。
 いずれ、空白に見えるものが列によってNullだったり空文字列だったり、というのでは混乱のもとですので、設定の際は十分に気をつける必要があります。