全て クラス 名前空間 関数 変数 型定義 列挙型 列挙値 ページ
NULLキー

NULLキーについて説明します。

NULLキーとは

NULLキーは特殊なINDEXで、キーフィールドにNULLが指定されて保存された場合、そのレコードをインデックスに含めません。 それにより必要なレコードのみのコンパクトなインデックスにすることができます。
多くのデータベースではこのNULLキーがサポートされますが、Innodbではサポートされていません。 しかし、Transactdではこの機能をエミュレートして実現しています。
InnodbはキーフィールドにNULLが指定されてもインデックスに含まれるためコンパクトなINDEXは実現できませんが、 必要なレコードのみアクセスできる機能をエミュレートします。
例えば、キー番号にNULLキーの番号を指定し table::seekFirst() を呼び出すと非NULL値の最初のレコードに移動します。 キーフィールドにNULL値を持つレコードにはこのキーを指定した場合アクセスできません。
但しこれは昇順にアクセスした場合のみで、非NULL値を持つカレントレコードから、連続して逆順に table::seekPrev() した場合はNULL値を持つレコードにもアクセス可能です。
NULLキーをエミュレートした機能は、昇順アクセスのみであることに注意してください。
またこの機能は、database::setCompatibleMode() で指定した値にかかわらず同様です。

NULLキーの用途

NULLキーは一時的にレコードにマーキングなどを行う際にとても便利です。例えば、後でバッチ処理が必要なレコードのキーフィールドに1を指定しこのレコードをインデックスに含めます。 バッチ処理では、ー番号にNULLキーの番号を指定し table::seekFirst() から順に table::seekNext() することでマーキングしたレコードに無駄なくアクセスできます。 処理が完了したらすべてのキーフィールドに0を指定してインデックスから除外して処理済にします。

NULLキーの指定方法

キーには、複数のセグメントフィールドをものがあります。この場合、NULLキーはどれか1つ以上のフィールド値がNULLの場合に インデックスに含めない任意セグメントNULLキーと、すべてのフィールドがNULLの時にインデックスに含めない全セグメントNULLキーの2種類があります。
NULLキーは、スキーマのキー定義 keySegment::flags にて指定します。任意セグメントNULLキーは flags.bit9 全セグメントNULLキーは flags.bit3 にて指定します。

注釈
NULLキーはスキーマの定義を実際のinnodbテーブルに反映する必要があります。テーブルが作成された後に変更した場合は そのINDEXの再作成が必要です。

NULLキーの指定方法

レコードを保存する際に、NULLキーフィールドの値がNULLであるかどうかの判定は、テーブルをオープンする時の database::setCompatibleMode() で指定した値によって異なります。 デフォルトの CMP_MODE_MYSQL_NULL の場合は 真にNULLが指定されていた場合NULLです。CMP_MODE_OLD_NULLの場合は 数値ならゼロ、文字列であれば長さゼロの文字列でNULLとして判定されます。

Transactd SDK 2018年07月31日(火) 19時40分24秒 doxygen