このトピックでは、Lindorm SQL を使用してワイルドカード列を使用する方法について説明します。
背景情報
従来の SQL 文では、大量のデータを処理する必要があるシナリオでのビジネス要件をほとんど満たすことができません。たとえば、データベースには、Internet of Vehicles(IoV)シナリオで数百または数千の非固定列が含まれている場合があります。データベースに新しい列を書き込むには、非効率的な ALTER TABLE 文を実行する必要があります。
Lindorm は、データを動的に書き込みおよびクエリできる動的カラムをサポートしています。ただし、動的カラムは現在、VARBINARY データのみをサポートしています。より多くの種類のデータを動的カラムに書き込むことができるように、Lindorm はワイルドカード列を提供します。
ワイルドカード列の名前は、ワイルドカードとしてアスタリスク(*)と疑問符(?)をサポートしています。名前にワイルドカードが一致する列のデータは、指定された型に変換されます。2 つのワイルドカードは異なる文字を示します。
疑問符(?)は 1 文字に一致します。
アスタリスク(*)は、空にすることができる文字シーケンスに一致します。
たとえば、c* int という名前のワイルドカード列をテーブルのスキーマに追加すると、c10、c11、c20 など、文字 c で始まる名前の任意の列を書き込むことができます。これらの列のデータの型は INT に変換されます。
前提条件
LindormTable のバージョンは 2.5.3 以降です。 LindormTable のバージョンを表示または スペックアップ する方法の詳細については、「LindormTable のリリースノート」および「Lindorm インスタンスのマイナーエンジンバージョンのスペックアップ」をご参照ください。
制限事項
ワイルドカード列をプライマリキーとして指定することはできません。
SELECT *文を使用してワイルドカード列を含むテーブルのデータをクエリするには、文に LIMIT 句を追加する必要があります。例:SELECT * FROM t_dynamic_columns LIMIT 10;ワイルドカード列に対して作成できるのは、検索インデックスのみです。セカンダリインデックスは、ワイルドカード列に対して作成できません。たとえば、次の文はサポートされていません:
CREATE INDEX idx on tb(c2*);ワイルドカードを含む列名は、データをクエリするための条件として使用できません。SELECT 文および WHERE 句の条件として使用できるのは、実際の列名のみです。たとえば、次の文はサポートされていません:
SELECT c1*, c2 WHERE c2 > 10;およびSELECT c1*, c2 WHERE c1* > 10;次の文はサポートされています:SELECT pk, c1, c2, c21, c31 WHERE c21 > 10 AND c31 < 'c300';
DDL
ワイルドカード列を含むテーブルを作成する
次の文を実行して tb という名前のテーブルを作成し、pk 列をプライマリキーとして指定し、WITH 句で次の 2 つのワイルドカード列を指定できます: c2* および c3*。 c2* 列のデータ型は BIGINT で、c3* 列のデータ型は VARCHAR です。
CREATE TABLE tb(pk INTEGER, c1 VARCHAR, `c2*` BIGINT, `c3*` VARCHAR, PRIMARY KEY(pk)) WITH(wildcard_column='c2*,c3*');上記の文に基づいて、列の名前が c2 で始まり(c2、c21、c22 など)、列のデータ型が BIGINT の場合、列は tb テーブルに書き込むことができます。列の名前が c2 で始まり、列のデータ型が BIGINT でない場合、列は tb テーブルに書き込むことができ、列のデータ型は BIGINT に変換されます。同様に、列の名前が c3 で始まり(c32、c33、c35 など)、列のデータ型が VARCHAR の場合、列は tb テーブルに書き込むことができます。列の名前が c3 で始まり、列のデータ型が VARCHAR でない場合、列は tb テーブルに書き込むことができ、列のデータ型は VARCHAR に変換されます。
ワイルドカード列に検索インデックスを作成する
ワイルドカード列に対して検索インデックスを作成できます。次の文を実行して、tb テーブルの c2* および c3* ワイルドカード列に検索インデックスを作成できます。名前にワイルドカードが一致するすべての列は、検索インデックスによってインデックス化されます。
CREATE INDEX idx USING SEARCH ON tb(`c2*`, `c3*`);DML
列にデータを書き込む
ワイルドカード列に一致する列にデータを書き込む場合、文で指定する 列 は次の要件を満たしている必要があります。
列名は、ワイルドカード列で指定された一致ルールを満たしている必要があります。
列のデータ型は、ワイルドカード列で指定されたデータ型を満たしている必要があります。
UPSERT INTO tb(pk, c1, c2, c21, c22, c31) VALUES (1, 'a1', 2, 21, 22, 'c3');