Version3 リリースノート
NULLを許可するフィールドの扱いは完全にSQLコマンドのそれと同じになりました。 NULLの扱いと言ってもさまざまな点がありますので詳しく説明します。
項目 | 内容 |
---|---|
NULL可否 | テーブル作成時にフィールドのNULL可否の指定 |
デフォルトNULL | NULLを許可するフィールドのデフォルト値としてのNULL指定 |
スキーマテーブル自動生成 | スキーマテーブル自動生成時にNULLの可否とデフォルト値の反映 |
NULLの指定と読取 | NULLを許可するフィールドの値としてNULLを読み書きする |
NULLの演算 | レコードのフィルタリングまたはソート時にNULLとそのほかの値の比較 |
これらについて、2.xと3.0でそれぞれ対応内容をまとめます。
内容 | 2.x | 3.0 |
---|---|---|
NULL可否 | NULL可を指定できない | NULL可否を指定できる |
デフォルトNULL | デフォルト値を指定できない | NULLを含めたデフォルト値を指定できる |
スキーマテーブル自動生成 | NULLの可否をおよびデフォルト値を反映しない | NULLの可否をおよびデフォルト値を反映する |
NULLの指定と読取 | 読み取りでNULLはゼロまたは""(空文字)として返す。 書き込みでNULLを許可する場合、ゼロまたは""(空文字)はNULLとして保存 | NULLの指定と読取ができる |
NULLの演算 | N/A | NULL同士またはNULLと値を比較できる |
Transactd 2.xでは、NULLをゼロまたは""(空文字)として扱うものとして、NULLという概念を導入していませんでした。 これはTransactdだけですべての処理を行う場合とてもシンプルで判りやすいものです。 しかしながら、すでにSQLで作成されたNULLを含んだテーブルでNULLをゼロまたは空文字と区別して扱う場合は都合が悪いものでした。 (NULLをゼロまたは空文字と区別して扱っていない場合は問題なく処理できます)
Transactd 3.0では、NULLをゼロまたは空文字と区別して扱えるよう完全にNULLをサポートします。 また、従来のようにシンプルに扱える2.x互換モードもサポートします。
NULLを完全に扱うモードと従来のモードを database::setCompatibleMode(int) で切り替えることができます。 CMP_MODE_MYSQL_NULL = 1
がデフォルトでNULLを完全に扱うモードです。 CMP_MODE_OLD_NULL = 0
を指定すると 2.x互換のモードで動作します。
Transactd 3.0で従来の2.xと同じように動作させたい場合は、プログラムの先頭で、 database::setCompatibleMode(CMP_MODE_OLD_NULL)
と指定してください。
table クラスと field クラスにNULLの設定と読み取りメソッドが追加されました。
table | field | |
---|---|---|
set | setFVNull(short index, bool value) | setNull(bool value) |
get | getFVNull(short index) | isNull() |
NULLが設定されたフィールドに、 table::setFV() や field::operator=() 関数などで数値や文字列の値をセットすると自動で非NULLに設定されます。 また、それらの関数に各言語のnullまたはNULLポインターを渡すことでsetNull(true)と同じ処理をすることもできます。
フィールドがNULLかどうかの比較は、比較演算子に "<==>" と "<!=>"が使用できます。最初の"<==>"はNULLにマッチし、"<!=>"は非NULLにマッチ します。比較演算子に値の意味も含むため値は無視されます。
具体的にはwhere("name", "<==>", "")
のように使用します。また、NULL専用の比較メソッド whereIsNull("name")
も追加されました。このメソッドは先ほどの where() と全く同じ意味になります。
フィールドの値とNULLの比較方法
内容 | 専用関数で記述 | 汎用関数で記述< |
---|---|---|
NULLにマッチ | whereIsNull("name") andIsNull("name") orIsNull("name") | where("name", "<==>", "") and_("name", "<==>", "") or_("name", "<==>", "") |
非NULLにマッチ | whereIsNotNull("name") andIsNotNull("name") orIsNotNull("name") | where("name", "<!=>", "") and_("name", "<!=>", "") or_("name", "<!=>", "") |
Transactd APIによるテーブルの作成でデフォルト値が指定できるようになりました。TIMESTAMPのDEFAULT CURRENT_TIMESTAMPなどの指定も可能です。 指定方法は fielddef::setDefaultValue() を参照してください。
また、 table::clearBuffer() を呼び出すと、デフォルト値が設定されたフィールドの値はその値で初期化されます。DEFAULT NULLの場合はNULL値になります。
スキーマテーブルを自動生成する際もNULLの可否とデフォルト値を正しく読み取ってtransactd用のスキーマテーブルに保存します。
ほとんどの場合、従来のアプリケーションもこれで問題なく動作しますが、インデックスフィールドにNULLを許可するフィールドがある場合は、それを通常のキーとするか、NULLにはアクセスしないNULLキーとするか指定が必要です。
指定は、スキーマテーブルを自動生成する前に、 database::setAutoSchemaUseNullkey(bool )
で行います。trueを指定すると、インデックスフィールドにNULLを許可するフィールドがある場合は、そのキーをNULLキーとマークします。
何も設定しない場合、デフォルトでfalseです。
Transactdクライアントに、スキーマ情報は必須ですがそれをテーブルとして保存が必須ではなくなりました。
スキーマテーブル使用しない場合は、 database::open()
のuri でスキーマテーブルの指定を省略できます。 また、テーブルのオープンは必ず名前を指定して行います。正しく オープンできると、サーバー側でダイナミックにスキーマ情報生成 しクライアントに転送します。
NULLの対応と併せてSQL文主体によるアプリケーションで、部分的にTransactdを使用するのがとても手軽になりました。
また、テーブル構造の変更などがあった場合も、スキーマテーブルを実態に同期させる必要がないため運用も簡単です。
Transactd 2.4 と3.0はプラグイン、クライアントのバージョンが異なっても正しく動作します。 ただし、どちらか一方が2.4の場合、3.0の新機能は利用できません。
また、クライアントが3.0で、プラグインが2.4の場合は、database::setCompatibleMode(CMP_MODE_OLD_NULL)を必ず 指定しなければなりません。指定しなかった場合は、 database::openTable() でSTATUS_INVALID_NULLMODEエラーが返ります。