NULLキーについて説明します。
NULLキーは特殊なINDEXで、キーフィールドにNULLが指定されて保存された場合、そのレコードをインデックスに含めません。 それにより必要なレコードのみのコンパクトなインデックスにすることができます。
多くのデータベースではこのNULLキーがサポートされますが、Innodbではサポートされていません。 しかし、Transactdではこの機能をエミュレートして実現しています。
InnodbはキーフィールドにNULLが指定されてもインデックスに含まれるためコンパクトなINDEXは実現できませんが、 必要なレコードのみアクセスできる機能をエミュレートします。
例えば、キー番号にNULLキーの番号を指定し table::seekFirst() を呼び出すと非NULL値の最初のレコードに移動します。 キーフィールドにNULL値を持つレコードにはこのキーを指定した場合アクセスできません。
但しこれは昇順にアクセスした場合のみで、非NULL値を持つカレントレコードから、連続して逆順に table::seekPrev() した場合はNULL値を持つレコードにもアクセス可能です。
NULLキーをエミュレートした機能は、昇順アクセスのみであることに注意してください。
またこの機能は、database::setCompatibleMode() で指定した値にかかわらず同様です。
NULLキーは一時的にレコードにマーキングなどを行う際にとても便利です。例えば、後でバッチ処理が必要なレコードのキーフィールドに1を指定しこのレコードをインデックスに含めます。 バッチ処理では、ー番号にNULLキーの番号を指定し table::seekFirst() から順に table::seekNext() することでマーキングしたレコードに無駄なくアクセスできます。 処理が完了したらすべてのキーフィールドに0を指定してインデックスから除外して処理済にします。
キーには、複数のセグメントフィールドをものがあります。この場合、NULLキーはどれか1つ以上のフィールド値がNULLの場合に インデックスに含めない任意セグメントNULLキーと、すべてのフィールドがNULLの時にインデックスに含めない全セグメントNULLキーの2種類があります。
NULLキーは、スキーマのキー定義 keySegment::flags にて指定します。任意セグメントNULLキーは flags.bit9 全セグメントNULLキーは flags.bit3 にて指定します。
レコードを保存する際に、NULLキーフィールドの値がNULLであるかどうかの判定は、テーブルをオープンする時の database::setCompatibleMode() で指定した値によって異なります。 デフォルトの CMP_MODE_MYSQL_NULL の場合は 真にNULLが指定されていた場合NULLです。CMP_MODE_OLD_NULLの場合は 数値ならゼロ、文字列であれば長さゼロの文字列でNULLとして判定されます。