CREATE TABLE
CREATE TABLE語(yǔ)句用于在Lindorm寬表引擎或時(shí)序引擎中創(chuàng)建表,支持多種數(shù)據(jù)類(lèi)型,例如VARCHAR、TIMESTAMP、BIGINT等;支持多種表屬性,例如數(shù)據(jù)有效期TTL、壓縮算法COMPRESSION等。您可以靈活搭配各種表屬性和數(shù)據(jù)類(lèi)型,設(shè)計(jì)出更貼合業(yè)務(wù)場(chǎng)景的表。
引擎與版本
CREATE TABLE適用于寬表引擎和時(shí)序引擎。
時(shí)序引擎自3.4.32版本開(kāi)始支持標(biāo)準(zhǔn)CREATE TABLE語(yǔ)法。如何查看或升級(jí)時(shí)序引擎版本,請(qǐng)參見(jiàn)時(shí)序引擎版本說(shuō)明和升級(jí)小版本。
語(yǔ)法
create_table_statement ::= CREATE TABLE [ IF NOT EXISTS ] table_identifier
'('
column_definition
( ',' column_definition )*
',' PRIMARY KEY '(' primary_key ')'
')'
[ PARTITION BY partition_definition ]
[ WITH table_options ]
column_definition ::= column_identifier data_type [ NOT NULL ]
primary_key ::= column_identifier [ ',' column_identifier (ASC|DESC)]
partition_definition ::= HASH '(' column_identifier (',' column_identifier )* ')'
table_options ::= '(' option_definition (',' option_definition )* ')'
option_definition ::= option_identifer '=' string_literal
差異說(shuō)明
Lindorm寬表引擎和時(shí)序引擎的CREATE TABLE語(yǔ)法差異較大。差異對(duì)比請(qǐng)參見(jiàn)下表。
語(yǔ)法要素 | 寬表引擎 | 時(shí)序引擎 |
〇 | 〇 | |
〇 | 〇 | |
〇 | 〇 | |
?? | 〇 | |
〇 | ?? |
使用說(shuō)明
表名(table_identifier)
關(guān)于表名的設(shè)置,您需要注意以下內(nèi)容:
可包含數(shù)字、大寫(xiě)英文字符、小寫(xiě)英文字符、半角句號(hào)(.)、中劃線(-)和下劃線(_)。
表名不能以半角句號(hào)(.)或中劃線(-)開(kāi)頭。
表名的長(zhǎng)度為1~255字符。
列定義(column_definition)
語(yǔ)法要素 | 是否必填 | 使用說(shuō)明 |
列名(column_identifier) | 是 |
|
數(shù)據(jù)類(lèi)型(data_type) | 是 | 支持的數(shù)據(jù)類(lèi)型,請(qǐng)參見(jiàn)數(shù)據(jù)類(lèi)型。 重要 創(chuàng)建時(shí)序表時(shí),如果需要使用時(shí)間戳(TIMESTAMP)數(shù)據(jù)類(lèi)型,請(qǐng)注意以下幾點(diǎn):
|
NULL約束 | 否 | 列的值是否允許為NULL。 重要 目前Lindorm SQL不會(huì)進(jìn)行NULL約束的校驗(yàn),該校驗(yàn)工作是由存儲(chǔ)引擎執(zhí)行的。 NULL約束的校驗(yàn)方式取決于存儲(chǔ)引擎的校驗(yàn)規(guī)則,不同存儲(chǔ)引擎的校驗(yàn)規(guī)則不同,因此在使用過(guò)程中可能會(huì)出現(xiàn)已指定NOT NULL但仍可寫(xiě)入NULL的情況。 為保證數(shù)據(jù)能夠正常寫(xiě)入,請(qǐng)遵循以下統(tǒng)一要求:
|
主鍵(primary_key)
主鍵是表中數(shù)據(jù)的唯一標(biāo)識(shí),由一列或多列組成,建表時(shí)必須指定主鍵PRIMARY KEY。
在使用CREATE TABLE
語(yǔ)句建表時(shí),需要注意以下內(nèi)容:
引擎類(lèi)型 | 主鍵使用說(shuō)明 |
寬表引擎 |
|
時(shí)序引擎 |
|
分區(qū)(partition_definition)
僅時(shí)序引擎支持分區(qū)。在時(shí)序表中,用作PARTITION BY的列必須是主鍵定義中的VARCHAR列。
建表時(shí),您可以通過(guò)PARTITION BY HASH(column1, column2, ..., columnN)
語(yǔ)句,顯示指定一個(gè)或多個(gè)列為表進(jìn)行Hash分區(qū)。例如:PARTITION BY HASH(c1, p1)
。
表屬性(table_options)
僅寬表引擎支持表屬性(table_options)。您可以通過(guò)WITH
關(guān)鍵字添加以下表屬性:
選項(xiàng) | 類(lèi)型 | 描述 |
COMPRESSION | STRING | 表的壓縮算法。可選的壓縮算法分別是:
說(shuō)明 寬表引擎2.3.4版本前默認(rèn)未指定壓縮算法,寬表引擎2.3.4及以后的版本默認(rèn)壓縮算法為ZSTD。 |
TTL | INT | 數(shù)據(jù)有效期,單位為秒(s)。 說(shuō)明
|
COMPACTION_MAJOR_PERIOD | LONG | 系統(tǒng)執(zhí)行 說(shuō)明 默認(rèn)值:Math.Min(TTL,1728000000ms)。如果不設(shè)置TTL,系統(tǒng)默認(rèn)該參數(shù)值為20天(20*24*60*60*1000ms=1728000000ms)。 |
MUTABILITY | STRING | 索引相關(guān),表示對(duì)主表的寫(xiě)入模式進(jìn)行分類(lèi)。默認(rèn)值為MUTABLE_LATEST。 所有取值如下:
取值的詳細(xì)說(shuō)明,請(qǐng)參見(jiàn)高性能原生二級(jí)索引。 重要 創(chuàng)建索引表后,MUTABILITY參數(shù)的值不支持修改。 |
CONSISTENCY | STRING | 表的一致性屬性。對(duì)于多可用區(qū)實(shí)例,該參數(shù)表示主備數(shù)據(jù)的一致性。包括以下兩種級(jí)別:
重要 對(duì)于多可用區(qū)實(shí)例,如果數(shù)據(jù)存在先讀后寫(xiě),例如increase、append、索引更新,則需要指定主表CONSISTENCY參數(shù)的值為 |
NUMREGIONS | INT | 預(yù)先設(shè)置建表時(shí)的Region數(shù)。 |
CHS | INT | 冷熱分界線,單位為秒。 說(shuō)明
|
STARTKEY和ENDKEY | 與PRIMARY KEY中第一個(gè)列的數(shù)據(jù)類(lèi)型相同 | 預(yù)先設(shè)置建表的Region分區(qū)起止Key。 說(shuō)明
|
SPLITKEYS | 與PRIMARY KEY中第一個(gè)列的數(shù)據(jù)類(lèi)型相同 | 預(yù)先設(shè)置表的全部預(yù)分區(qū)的起始Key。 說(shuō)明
|
SPLITALGO | STRING | 定義預(yù)分區(qū)的分裂算法。目前僅支持以下分裂算法:
|
DYNAMIC_COLUMNS | STRING | 是否開(kāi)啟動(dòng)態(tài)列。取值:
說(shuō)明 動(dòng)態(tài)列僅支持Varbinary類(lèi)型。關(guān)于動(dòng)態(tài)列的介紹,請(qǐng)參見(jiàn)動(dòng)態(tài)列。 |
VERSIONS | STRING | 列值保留的版本數(shù)。取值為大于等于1的整數(shù)。默認(rèn)值為1,表示保留一個(gè)版本。Lindorm支持列值保留多個(gè)版本,多版本管理的詳細(xì)說(shuō)明,請(qǐng)參見(jiàn)多版本數(shù)據(jù)管理。 重要 VERSIONS參數(shù)的值過(guò)大可能會(huì)影響數(shù)據(jù)的查詢(xún)和存儲(chǔ)性能,請(qǐng)盡量避免設(shè)置過(guò)大的值。建議將VERSIONS的值設(shè)置1。 |
BLOB_BUCKET_NAME | STRING | 為包含BLOB列的表創(chuàng)建BUCKET。取值為自定義的BUCKET名稱(chēng)。 BUCKET名稱(chēng)需遵循以下規(guī)則:
說(shuō)明
|
2.2.16版本前的寬表引擎在設(shè)置表屬性時(shí)不支持WITH
關(guān)鍵字,需在表屬性關(guān)鍵字前后添加半角單引號(hào)('),屬性值可以基于類(lèi)型進(jìn)行設(shè)置。如果屬性值的類(lèi)型是字符串(STRING)則需在字符串前后添加半角單引號(hào)('),例如CREATE TABLE IF NOT EXISTS t1(c1 varchar, c2 bigint, c3 int, c4 int, PRIMARY KEY(c1,c2)) 'CONSISTENCY'='strong';
。
示例
創(chuàng)建表
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)
);
結(jié)果驗(yàn)證
您可以執(zhí)行DESCRIBE table sensor;
查看表是否已創(chuàng)建成功。
指定數(shù)據(jù)有效期和壓縮算法
創(chuàng)建寬表時(shí)指定數(shù)據(jù)有效期為30天(2592000秒),壓縮算法為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');
結(jié)果驗(yàn)證
您可以執(zhí)行
DESCRIBE table sensor;
查看表是否已創(chuàng)建成功。在集群管理系統(tǒng)的概覽頁(yè)面,單擊目標(biāo)數(shù)據(jù)庫(kù)下的目標(biāo)表名。在當(dāng)前詳情表格區(qū)域,單擊查看表屬性,查看COMPRESSION和TTL參數(shù)的值。如何進(jìn)入集群管理系統(tǒng),請(qǐng)參見(jiàn)登錄集群管理系統(tǒng)。
指定Major Compaction周期
創(chuàng)建寬表時(shí)指定Major Compaction的周期為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');
結(jié)果驗(yàn)證
您可以執(zhí)行
DESCRIBE table sensor;
查看表是否已創(chuàng)建成功。在集群管理系統(tǒng)的概覽頁(yè)面,單擊目標(biāo)數(shù)據(jù)庫(kù)下的目標(biāo)表名。在當(dāng)前詳情表格區(qū)域,單擊查看表屬性,查看COMPACTION_MAJOR_PERIOD參數(shù)的值。
開(kāi)啟動(dòng)態(tài)列功能
創(chuàng)建寬表時(shí)將DYNAMIC_COLUMNS參數(shù)的值設(shè)置為TRUE
后,支持在表中寫(xiě)入動(dòng)態(tài)列數(shù)據(jù)。
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');
結(jié)果驗(yàn)證
您可以執(zhí)行
DESCRIBE table sensor;
查看表是否已創(chuàng)建成功。在集群管理系統(tǒng)的概覽頁(yè)面,單擊目標(biāo)數(shù)據(jù)庫(kù)下的目標(biāo)表名。在當(dāng)前詳情表格區(qū)域,單擊查看表屬性,查看DYNAMIC_COLUMNS參數(shù)的值。
指定冷熱分界線
創(chuàng)建寬表時(shí)設(shè)置冷熱分界線,系統(tǒng)將根據(jù)冷熱分界線歸檔數(shù)據(jù)。
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');
結(jié)果驗(yàn)證
您可以執(zhí)行
DESCRIBE table sensor;
查看表是否已創(chuàng)建成功。在集群管理系統(tǒng)的概覽頁(yè)面,單擊目標(biāo)數(shù)據(jù)庫(kù)下的目標(biāo)表名。在當(dāng)前詳情表格區(qū)域,單擊查看表屬性,查看CHS和CHS_L2參數(shù)的值。
同時(shí)設(shè)置多個(gè)屬性
創(chuàng)建寬表時(shí)指定表的壓縮算法、數(shù)據(jù)有效期以及冷熱分界線。
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');
結(jié)果驗(yàn)證
您可以執(zhí)行
DESCRIBE table sensor;
查看表是否已創(chuàng)建成功。在集群管理系統(tǒng)的概覽頁(yè)面,單擊目標(biāo)數(shù)據(jù)庫(kù)下的目標(biāo)表名。在當(dāng)前詳情表格區(qū)域,單擊查看表屬性,查看COMPRESSION、CHS、CHS_L2和TTL參數(shù)的值。
設(shè)置分區(qū)
創(chuàng)建寬表時(shí)預(yù)定義5個(gè)分區(qū),且5個(gè)分區(qū)的起始Key為1000,終止Key為9000。
CREATE TABLE sensor (
p1 INTEGER NOT NULL,
c1 INTEGER,
c2 VARCHAR,
c3 VARCHAR,
PRIMARY KEY(p1)
) WITH (NUMREGIONS='5', STARTKEY='1000', ENDKEY='9000');
結(jié)果驗(yàn)證
您可以執(zhí)行
DESCRIBE table sensor;
查看表是否已創(chuàng)建成功。在集群管理系統(tǒng)的概覽頁(yè)面,單擊目標(biāo)數(shù)據(jù)庫(kù)下的目標(biāo)表名。在分片詳情區(qū)域,查看各分片的startKey和endKey參數(shù)的值。
設(shè)置多個(gè)分區(qū)的起始Key
創(chuàng)建寬表時(shí)預(yù)定義5個(gè)分區(qū)的起始Key,表創(chuàng)建好后默認(rèn)包含6個(gè)預(yù)分區(qū)。
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');
結(jié)果驗(yàn)證
您可以執(zhí)行
DESCRIBE table sensor;
查看表是否已創(chuàng)建成功。在集群管理系統(tǒng)的概覽頁(yè)面,單擊目標(biāo)數(shù)據(jù)庫(kù)下的目標(biāo)表名。在分片詳情區(qū)域,查看各分片的startKey和endKey參數(shù)的值。
顯式指定分區(qū)列
由于大部分查詢(xún)場(chǎng)景會(huì)查詢(xún)單個(gè)設(shè)備的瞬時(shí)數(shù)據(jù),因此可以顯式指定device_id作為數(shù)據(jù)分區(qū)的分區(qū)列。
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);
結(jié)果驗(yàn)證
您可以執(zhí)行DESCRIBE TABLE sensor;
語(yǔ)句,驗(yàn)證建表結(jié)果。