CREATE TABLE 文を使用して、LindormTable または LindormTSDB にテーブルを作成します。この文は、VARCHAR、TIMESTAMP、BIGINT などのデータの型や、生存時間 (TTL)、圧縮アルゴリズムなどのテーブルプロパティをサポートしています。
対応エンジンとバージョン
CREATE TABLE は LindormTable および LindormTSDB に適用されます。
LindormTSDB はバージョン 3.4.32 以降で標準的な CREATE TABLE 構文をサポートしています。エンジンバージョンの確認またはスペックアップ方法については、「LindormTSDB バージョンガイド」および「マイナーバージョンの更新」をご参照ください。
構文
create_table_statement ::= CREATE TABLE [ IF NOT EXISTS ] table_identifier
'('
column_definition
( ',' column_definition )*
',' PRIMARY KEY '(' primary_key ')'
( ',' {KEY|INDEX} [index_identifier]
[ USING index_method_definition ]
[ INCLUDE column_identifier ( ',' column_identifier )* ]
[ WITH index_options ]
)*
')'
[ PARTITION BY partition_definition ]
[ ZORDER BY zorder_column_list ]
[ WITH table_options ]
column_definition ::= column_identifier data_type [ NOT NULL ]
primary_key ::= column_identifier [ ',' column_identifier (ASC|DESC)]
index_method_definition ::= { KV | SEARCH }
index_options ::= '('
option_definition (',' option_definition )*
')'
partition_definition ::= HASH '(' column_identifier (',' column_identifier )* ')'
zorder_column_list ::= column_identifier ( ',' column_identifier )*
table_options ::= '(' option_definition (',' option_definition )* ')'
option_definition ::= option_identifer '=' string_literalエンジン間の比較
CREATE TABLE の構文は、LindormTable と LindormTSDB で異なります。
| 構文要素 | LindormTable | LindormTSDB |
|---|---|---|
| テーブル名 (table_identifier) | サポート | サポート |
| カラム定義 (column_definition) | サポート | サポート |
| プライマリキー (primary_key) | サポート | サポート |
| インデックス式 (KEY|INDEX) | サポート | 未サポート |
| パーティション (partition_definition) | 未サポート | サポート |
| テーブルプロパティ (table_options) | サポート | 未サポート |
注意事項
テーブル名
使用可能な文字:数字、大文字、小文字、ピリオド (
.)、ハイフン (-)、アンダースコア (_)ピリオド (
.) またはハイフン (-) で開始することはできません。長さ:1~255 文字
カラム定義
| 要素 | 必須 | 備考 |
|---|---|---|
| カラム名 | はい | 使用可能な文字:数字、大文字/小文字、ピリオド (.)、ハイフン (-)、アンダースコア (_)。予約キーワードは使用できません。最大長:255 バイト。 |
| データの型 | はい | サポートされているデータの型については、「データの型」をご参照ください。 |
| NULL 制約 | いいえ | 以下の注記をご確認ください。 |
TIMESTAMP 型 (LindormTSDB のみ):
テーブルごとに TIMESTAMP 型のカラムは 1 つのみ許可されます。
LindormTSDB はタイムスタンプを UTC + 08:00 に基づいてエンコードおよび解析します。
レガシーシステムの 32 ビット UNIX タイムスタンプは、LindormTSDB に書き込む前に 1000 倍する必要があります。32 ビット UNIX タイムスタンプをそのまま書き込むと、意味解釈エラーが発生します。たとえば、
1641009600はレガシーシステムでは2022-01-01 12:00:00を表しますが、LindormTSDB では1970-01-20 07:50:09 (UTC + 08:00)と解釈されます。
NULL 制約の動作:
現在、Lindorm SQL は SQL レイヤーで NULL 制約を検証しません。検証はストレージエンジンが実施し、エンジンごとにルールが異なります。データの書き込みを確実に成功させるには、次の操作を行ってください。
すべてのプライマリキー列に
NOT NULLを指定します。プライマリキー以外のカラムには
NOT NULLを指定しないでください。
プライマリキー
プライマリキーはテーブル内の行を一意に識別します。1 つ以上のカラムで構成され、テーブル作成時に必ず指定する必要があります。
プライマリキーは作成後に変更できません。テーブル作成前に慎重に設計してください。
LindormTable のプライマリキー制限:
| 項目 | 制限 |
|---|---|
| 単一のプライマリキー列の最大長 | 2 KB |
| すべてのプライマリキー列の合計最大長 | 30 KB |
| 単一の非プライマリキー列の最大長 | 2 MB |
LindormTSDB のプライマリキー構造:
時系列テーブルでは、プライマリキー列は次の 2 つの異なるロールを果たします。
タグ列:VARCHAR 型のプライマリキー列。データソースを識別します。たとえば、IoT シナリオではデバイス ID、IoV シナリオでは車両識別子、モニタリングシナリオではアプリケーション ID または
ip:portなどです。タイムスタンプ列:TIMESTAMP 型のプライマリキー列。テーブルごとに 1 つのみ許可されます。
プライマリキーには 1 つ以上の VARCHAR (タグ) 列を含めることができますが、TIMESTAMP 列は 1 つのみです。すべてのプライマリキー列は VARCHAR または TIMESTAMP 型である必要があります。
時系列テーブルのプライマリキー設計に関するガイダンスについては、「プライマリキー設計のベストプラクティス」をご参照ください。
インデックス式 (KEY|INDEX)
KEY または INDEX キーワードを CREATE TABLE 文内で使用すると、テーブル作成時にインデックスを作成できます。これにより、セカンダリインデックスおよび検索インデックスを作成できます。
インデックス式は LindormTable 2.7.7 以降および Lindorm SQL 2.8.6.0 以降でのみサポートされています。バージョンの確認方法については、「LindormTable バージョンガイド」および「SQL バージョンガイド」をご参照ください。コンソールからスペックアップできない場合は、DingTalk の Lindorm テクニカルサポート (s0s3eg3) までご連絡ください。
インデックス命名: インデックス名を指定しない場合、システムは table_name_idx_${auto_increment_id} の形式で自動生成します。
セカンダリインデックスの冗長性 (INCLUDE を指定しない場合):
| Lindorm SQL バージョン | デフォルトの冗長性動作 |
|---|---|
| 2.9.3.10 以降 | カラムはデフォルトで冗長に格納されません |
| 2.9.3.10 より前 | すべてのカラムがデフォルトで冗長に格納されます (INDEX_COVERED_TYPE=COVERED_ALL_COLUMNS_IN_SCHEMA に相当。動的テーブルの場合は COVERED_DYNAMIC_COLUMNS に相当) |
KEY/INDEX 使用時のデフォルトテーブルプロパティ (MUTABILITY および CONSISTENCY を指定しない場合):
CONSISTENCY = 'strong'MUTABILITY = 'MUTABLE_LATEST'
インデックス作成失敗時の残留状態: インデックス作成中に例外が発生した場合、テーブルおよびインデックスが残留状態のままとなり、自動的にクリアされません。SHOW 文および DESCRIBE 文では引き続き表示されますが、データの書き込みおよびクエリが失敗する可能性があります。手動で残留テーブルおよびインデックスを削除し、再度作成してください。
パーティション
パーティションは LindormTSDB のみでサポートされています。PARTITION BY で使用するカラムは、プライマリキー内の VARCHAR カラムである必要があります。
構文:PARTITION BY HASH(column1, column2, ..., columnN)
テーブルプロパティ
テーブルプロパティは、WITH キーワードを介して LindormTable のみがサポートしています。
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
| COMPRESSION | STRING | なし (LindormTable 2.3.4 以降は ZSTD) | 圧縮アルゴリズム。有効な値:SNAPPY、ZSTD、LZ4。 |
| TTL | INT | 空 (期限なし) | データの生存時間 (秒単位)。TTL を削除するには、空文字列を設定します。「ALTER TABLE の例」をご参照ください。 |
| COMPACTION_MAJOR_PERIOD | LONG | Math.Min(TTL, 1728000000) ms。TTL がない場合は 20 日 (1,728,000,000 ms) | メジャーコンパクションの期間 (ミリ秒単位)。 |
| MUTABILITY | STRING | MUTABLE_LATEST | ベーステーブルのミュータビリティ。インデックス動作に関連します。有効な値:IMMUTABLE、IMMUTABLE_ROWS、MUTABLE_LATEST、MUTABLE_ALL、MUTABLE_UDT。インデックス作成後は変更できません。変更する前にすべてのインデックスを削除してください。「高性能ネイティブセカンダリインデックス」をご参照ください。 |
| CONSISTENCY | STRING | eventual | 整合性レベル。有効な値:eventual、strong。書き込み後の読み取り操作 (増分、追加、インデックス更新など) を伴うマルチゾーンインスタンスでは、strong に設定してください。 |
| NUMREGIONS | INT | — | テーブルの事前作成リージョン数。 |
| CHS | INT | — | ホット/コールドデータ境界 (秒単位)。コールドストレージを有効にする必要があります。CHS_L2='storagetype=COLD' と併用する必要があります。「ホットデータとコールドデータの分離」をご参照ください。 |
| STARTKEY および ENDKEY | 最初のプライマリキー列と同じ型 | — | 事前作成リージョンパーティションの開始キーおよび終了キー。NUMREGIONS が必要です。サポートされる型:SMALLINT、INTEGER、BIGINT、CHAR、VARCHAR、FLOAT、DOUBLE。 |
| SPLITKEYS | 最初のプライマリキー列と同じ型 | — | 事前作成パーティションすべての開始キー (カンマ区切り)。LindormTable 2.5.4 以降でサポートされています。NUMREGIONS、STARTKEY、ENDKEY とは併用できません。二重引用符内のカンマは通常の文字として扱われます。サポートされる型:STARTKEY/ENDKEY と同じです。 |
| SPLITALGO | STRING | — | 事前作成パーティションの分割アルゴリズム。有効な値:HexStringSplit (16 進数バイトで分割)、UniformSplit (元のバイト値で均等分割)。 |
| DYNAMIC_COLUMNS | STRING | False | 動的カラムを有効にします。有効な値:True、False。動的カラムは Varbinary 型のみをサポートします。「動的カラム」をご参照ください。 |
| VERSIONS | STRING | 1 | カラム値ごとに保持するバージョン数。1 以上の整数である必要があります。大きな値はクエリおよびストレージパフォーマンスに影響するため、マルチバージョン保持が必要でない限り、1 のままにしてください。「マルチバージョンデータ管理」をご参照ください。 |
| BLOB_BUCKET_NAME | STRING | — | BLOB カラムを持つテーブルの BUCKET を作成します。LindormTable 2.6.4 以降でサポートされています。BUCKET 名のルール:小文字、数字、ピリオド (.)、ハイフン (-)。長さ:3~63 文字。ハイフンで開始または終了してはいけません。ピリオドを連続させてはいけません。 |
LindormTable 2.2.16 より前のバージョンでは、WITHキーワードはサポートされていません。代わりに、プロパティキーワードを一重引用符で囲んでください。文字列値の場合は、値も一重引用符で囲んでください。例:CREATE TABLE IF NOT EXISTS t1(c1 varchar, c2 bigint, c3 int, c4 int, PRIMARY KEY(c1,c2)) 'CONSISTENCY'='strong';
使用例
基本テーブルの作成
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
);DESCRIBE table sensor; を実行して、テーブルが作成されたことを確認します。
セカンダリインデックス付きテーブルの作成
CREATE TABLE IF NOT EXISTS sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time),
KEY (temperature, time)
);確認方法:
DESCRIBE table sensor;を実行してテーブルを確認します。SHOW INDEX FROM sensor;を実行してセカンダリインデックスを確認します。
TTL および圧縮アルゴリズムの設定
TTL を 30 日 (2,592,000 秒)、圧縮を ZSTD に設定します。
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) WITH (COMPRESSION='ZSTD', TTL='2592000');確認方法:
DESCRIBE table sensor;を実行してテーブルを確認します。クラスター管理システムで 概要 ページに移動し、テーブル名をクリックして、現在の詳細テーブル エリアの [テーブルプロパティの表示] をクリックし、
COMPRESSIONおよびTTLの値を確認します。
メジャーコンパクション期間の設定
メジャーコンパクション期間を 10 日 (864,000,000 ミリ秒) に設定します。
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) WITH (COMPACTION_MAJOR_PERIOD='864000000');確認方法:DESCRIBE table sensor; を実行するか、クラスター管理システムの 現在の詳細テーブル エリアで [テーブルプロパティの表示] をクリックします。
動的カラムの有効化
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) WITH (DYNAMIC_COLUMNS='TRUE');確認方法:DESCRIBE table sensor; を実行するか、クラスター管理システムの 現在の詳細テーブル エリアで [テーブルプロパティの表示] をクリックします。
ホット/コールドデータ境界の設定
86,400 秒 (1 日) より古いデータをコールドストレージにアーカイブします。
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) WITH (CHS = '86400', CHS_L2 = 'storagetype=COLD');CHSはコールドストレージを有効にする必要があり、CHS_L2='storagetype=COLD'と併用する必要があります。
確認方法:DESCRIBE table sensor; を実行するか、クラスター管理システムの 現在の詳細テーブル エリアで [テーブルプロパティの表示] をクリックし、CHS および CHS_L2 の値を確認します。
複数プロパティの組み合わせ
圧縮、TTL、ホット/コールドデータ境界を同時に設定します。
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) WITH (
COMPRESSION='ZSTD',
CHS = '86400',
CHS_L2 = 'storagetype=COLD',
TTL = '2592000');確認方法:DESCRIBE table sensor; を実行するか、クラスター管理システムの 現在の詳細テーブル エリアで [テーブルプロパティの表示] をクリックし、COMPRESSION、CHS、CHS_L2、および TTL の値を確認します。
開始キーおよび終了キーによるパーティションの事前作成
開始キー 1000、終了キー 9000 で 5 つのパーティションを事前作成します。STARTKEY および ENDKEY には NUMREGIONS が必要です。
CREATE TABLE sensor (
p1 INTEGER NOT NULL,
c1 INTEGER,
c2 VARCHAR,
c3 VARCHAR,
PRIMARY KEY(p1)
) WITH (NUMREGIONS='5', STARTKEY='1000', ENDKEY='9000');確認方法:DESCRIBE table sensor; を実行するか、クラスター管理システムの シャード詳細 エリアに移動して、各シャードの startKey および endKey の値を確認します。
明示的な分割キーによるパーティションの事前作成
5 つの分割キーを指定して 6 つのパーティションを事前作成します。SPLITKEYS は NUMREGIONS、STARTKEY、または ENDKEY と併用できません。
CREATE TABLE sensor (
p1 INT NOT NULL,
p2 INT NOT NULL,
c1 VARCHAR,
c2 BIGINT,
PRIMARY KEY(p1, p2)
) WITH (SPLITKEYS = '100000,300000,500000,700000,900000');確認方法:DESCRIBE table sensor; を実行するか、クラスター管理システムの シャード詳細 エリアで startKey および endKey の値を確認します。
パーティションキー列の指定
単一デバイスの瞬間データを対象とするクエリの場合、device_id をパーティションキー列として指定してデータ分散を制御します。
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) PARTITION BY HASH(device_id);DESCRIBE TABLE sensor; を実行してテーブル作成結果を確認します。
時空間データテーブルの作成
任意の空間型 (GEOMETRY) — 任意の空間データ型を受け入れます:
CREATE TABLE geoms(gid INT, g GEOMETRY, PRIMARY KEY(gid));任意の空間型のデータを書き込みます:
UPSERT INTO geoms(gid, g) VALUES
(0, ST_GeomFromText('POINT(-10.1 3.3)')),
(1, ST_GeomFromText('LINESTRING(-12.2 4.3, -10.2 4.3)')),
(2, ST_GeomFromText('POLYGON((2 2, 2 8, 8 8, 8 2, 2 2))'));ポイント型のみ:
CREATE TABLE pts(gid INT, g GEOMETRY(POINT), PRIMARY KEY(gid));UPSERT INTO pts(gid, g) VALUES(0, ST_MakePoint(0,0)),(1, ST_MakePoint(1,1));ポリゴン型のみ:
CREATE TABLE polys(gid INT, g GEOMETRY(POLYGON), PRIMARY KEY(gid));UPSERT INTO polys(gid,g) VALUES(0, ST_GeomFromText('POLYGON((2 2, 2 8, 8 8, 8 2, 2 2))'));ラインストリング型のみ:
CREATE TABLE lines(gid INT, g GEOMETRY(LINESTRING), PRIMARY KEY(gid));UPSERT INTO lines(gid,g) VALUES(0, ST_GeomFromText('LINESTRING(-12.2 4.3, -10.2 4.3)'));MULTIPOINT 型のみ:
CREATE TABLE multipoints(gid INT, g GEOMETRY(MULTIPOINT), PRIMARY KEY(gid));UPSERT INTO multipoints(gid,g) VALUES(0, ST_GeomFromText('MULTIPOINT (10 40, 40 30, 20 20, 30 10)'));MULTILINESTRING 型のみ:
CREATE TABLE multilines(gid INT, g GEOMETRY(MULTILINESTRING), PRIMARY KEY(gid));UPSERT INTO multilines(gid,g) VALUES(0, ST_GeomFromText('MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))'));MULTIPOLYGON 型のみ:
CREATE TABLE multipolys(gid INT, g GEOMETRY(MULTIPOLYGON), PRIMARY KEY(gid));UPSERT INTO multipolys(gid,g) VALUES(0, ST_GeomFromText('MULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))'));GEOMETRYCOLLECTION 型のみ:
CREATE TABLE collections(gid INT, g GEOMETRY(GEOMETRYCOLLECTION), PRIMARY KEY(gid));UPSERT INTO collections(gid,g) VALUES(0, ST_GeomFromText('GEOMETRYCOLLECTION (POINT (40 10), LINESTRING (10 10, 20 20, 10 40), POLYGON ((40 40, 20 45, 45 30, 40 40)))'));複数の空間カラム:
CREATE TABLE mix(gid INT, pt GEOMETRY(POINT), ply GEOMETRY(POLYGON), PRIMARY KEY(gid));