CREATE TABLE語句用於在Lindorm寬表引擎或時序引擎中建立表,支援多種資料類型,例如VARCHAR、TIMESTAMP、BIGINT等;支援多種表屬性,例如資料有效期間TTL、壓縮演算法COMPRESSION等。您可以靈活搭配各種表屬性和資料類型,設計出更貼合業務情境的表。
引擎與版本
文法
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
差異說明
Lindorm寬表引擎和時序引擎的CREATE TABLE文法差異較大。差異對比請參見下表。
|
文法要素 |
寬表引擎 |
時序引擎 |
|
〇 |
〇 |
|
|
〇 |
〇 |
|
|
〇 |
〇 |
|
|
〇 |
✖️ |
|
|
✖️ |
〇 |
|
|
〇 |
✖️ |
使用說明
表名(table_identifier)
關於表名的設定,您需要注意以下內容:
-
可包含數字、大寫英文字元、小寫英文字元、半形句號(.)、中劃線(-)和底線(_)。
-
表名不能以半形句號(.)或中劃線(-)開頭。
-
表名的長度為1~255字元。
列定義(column_definition)
|
文法要素 |
是否必填 |
使用說明 |
|
列名(column_identifier) |
是 |
|
|
資料類型(data_type) |
是 |
支援的資料類型,請參見資料類型。 重要
建立時序表時,如果需要使用時間戳(TIMESTAMP)資料類型,請注意以下幾點:
|
|
NULL約束 |
否 |
列的值是否允許為NULL。 重要
目前Lindorm SQL不會進行NULL約束的校正,該校正工作是由儲存引擎執行的。 NULL約束的校正方式取決於儲存引擎的校正規則,不同儲存引擎的校正規則不同,因此在使用過程中可能會出現已指定NOT NULL但仍可寫入NULL的情況。 為保證資料能夠正常寫入,請遵循以下統一要求:
|
主鍵(primary_key)
主鍵是表中資料的唯一標識,由一列或多列組成,建表時必須指定主鍵PRIMARY KEY。
主鍵建立後不支援修改,請您合理設計主鍵。
在使用CREATE TABLE語句建表時,需要注意以下內容:
|
引擎類型 |
主鍵使用說明 |
|
寬表引擎 |
|
|
時序引擎 |
|
索引運算式(KEY|INDEX)
在使用CREATE TABLE語句建立索引表時,可以通過KEY或INDEX關鍵字指定需要建立的索引。
使用注意事項
-
若未顯式指定索引名,則系統將預設產生一個索引名。產生的索引名格式為:
表名_idx_${自增編號}。 -
目前僅支援通過索引運算式建立二級索引和搜尋索引。
-
二級索引冗餘說明:
Lindorm SQL 2.9.3.10及以上版本
建立二級索引時未指定
INCLUDE,預設不冗餘所有列。Lindorm SQL 2.9.3.10之前版本
建立二級索引時未指定
INCLUDE,預設冗餘所有列。說明冗餘效果等同於索引屬性INDEX_COVERED_TYPE設定為
COVERED_ALL_COLUMNS_IN_SCHEMA(若此處建的表為動態表,則效果等同於COVERED_DYNAMIC_COLUMNS)。 -
如果在建表時指定了
KEY或INDEX子句,且未顯式指定MUTABILITY和CONSISTENCY屬性,則表將會預設具備兩個表屬性:CONSISTENCY = 'strong'、MUTABILITY='MUTABLE_LATEST'。 -
如果建表語句中包含索引運算式,則系統會先建表再建立索引。如果索引構建過程中出現異常,建立的表和索引可能會有殘留,不會自動被清理或刪除,您可以通過
SHOW、DESCRIBE等語句查看,但可能會無法正常寫入資料或查詢,因此建議您清理殘留的表和索引,重新建立。
分區(partition_definition)
僅時序引擎支援分區。在時序表中,用作PARTITION BY的列必須是主鍵定義中的VARCHAR列。
建表時,您可以通過PARTITION BY HASH(column1, column2, ..., columnN)語句,顯式指定一個或多個列為表進行Hash分區。例如:PARTITION BY HASH(c1, p1)。
表屬性(table_options)
僅寬表引擎支援表屬性(table_options)。您可以通過WITH關鍵字添加以下表屬性:
|
選項(option_identifer) |
類型 |
描述 |
|
COMPRESSION |
STRING |
表的壓縮演算法。可選的壓縮演算法分別是:
說明
寬表引擎2.3.4版本前預設未指定壓縮演算法,寬表引擎2.3.4及以後的版本預設壓縮演算法為ZSTD。 |
|
TTL |
INT |
資料有效期間,單位為秒(s)。 說明
|
|
COMPACTION_MAJOR_PERIOD |
LONG |
系統執行 說明
預設值:Math.Min(TTL,1728000000ms)。如果不設定TTL,系統預設該參數值為20天(20*24*60*60*1000ms=1728000000ms)。 |
|
MUTABILITY |
STRING |
索引相關,表示對主表的寫入模式進行分類。預設值為 所有取值如下:
取值的詳細說明,請參見高效能原生二級索引。 重要
建立索引表後,MUTABILITY參數的值不支援修改。如需調整該參數,則必須先刪除所有索引表。建議您在操作前做好資料備份以避免資料丟失。 |
|
CONSISTENCY |
STRING |
表的一致性屬性。對於多可用性區域執行個體,該參數表示主備資料的一致性。包括以下兩種層級:
重要
對於多可用性區域執行個體,如果資料存在先讀後寫,例如increase、append、索引更新,則需要指定主表CONSISTENCY參數的值為 |
|
NUMREGIONS |
INT |
預先設定建表時的Region數。 |
|
CHS |
INT |
冷熱分界線,單位為秒。 說明
|
|
STARTKEY和ENDKEY |
與PRIMARY KEY中第一個列的資料類型相同 |
預先設定建表的Region分區起止Key。 說明
|
|
SPLITKEYS |
與PRIMARY KEY中第一個列的資料類型相同 |
預先設定表的全部預分區的起始Key。 說明
|
|
SPLITALGO |
STRING |
定義預分區的分裂演算法。目前僅支援以下分裂演算法:
|
|
DYNAMIC_COLUMNS |
STRING |
是否開啟動態列。取值:
|
|
VERSIONS |
STRING |
列值保留的版本數。取值為大於等於1的整數。預設值為1,表示保留一個版本。Lindorm支援列值保留多個版本,多版本管理的詳細說明,請參見多版本資料管理。 重要
VERSIONS參數的值過大可能會影響資料的查詢和儲存效能,請盡量避免設定過大的值。建議將VERSIONS的值設定1。 |
|
BLOB_BUCKET_NAME |
STRING |
為包含BLOB列的表建立BUCKET。取值為自訂的BUCKET名稱。 BUCKET名稱需遵循以下規則:
說明
|
2.2.16版本前的寬表引擎在設定表屬性時不支援WITH關鍵字,需在表屬性關鍵字前後添加半形單引號('),屬性值可以基於類型進行設定。如果屬性值的類型是字串(STRING)則需在字串前後添加半形單引號('),例如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;查看二級索引是否建立成功。
指定資料有效期間和壓縮演算法
建立寬表時指定資料有效期間為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');
結果驗證
-
您可以執行
DESCRIBE table sensor;查看錶是否已建立成功。 -
在叢集管理系統的概览頁面,單擊目標資料庫下的目標表名。在當前詳情表格地區,單擊查看錶屬性,查看COMPRESSION和TTL參數的值。
指定Major Compaction周期
建立寬表時指定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');
結果驗證
-
您可以執行
DESCRIBE table sensor;查看錶是否已建立成功。 -
在叢集管理系統的概览頁面,單擊目標資料庫下的目標表名。在當前詳情表格地區,單擊查看錶屬性,查看COMPACTION_MAJOR_PERIOD參數的值。
開啟動態列功能
建立寬表時將DYNAMIC_COLUMNS參數的值設定為TRUE後,支援在表中寫入動態列資料。
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;查看錶是否已建立成功。 -
在叢集管理系統的概览頁面,單擊目標資料庫下的目標表名。在當前詳情表格地區,單擊查看錶屬性,查看DYNAMIC_COLUMNS參數的值。
指定冷熱分界線
建立寬表時設定冷熱分界線,系統將根據冷熱分界線歸檔資料。
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');
結果驗證
-
您可以執行
DESCRIBE table sensor;查看錶是否已建立成功。 -
在叢集管理系統的概览頁面,單擊目標資料庫下的目標表名。在當前詳情表格地區,單擊查看錶屬性,查看CHS和CHS_L2參數的值。
同時設定多個屬性
建立寬表時指定表的壓縮演算法、資料有效期間以及冷熱分界線。
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參數的值。
設定分區
建立寬表時預定義5個分區,且5個分區的起始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');
結果驗證
-
您可以執行
DESCRIBE table sensor;查看錶是否已建立成功。 -
在叢集管理系統的概览頁面,單擊目標資料庫下的目標表名。在分區詳情地區,查看各分區的startKey和endKey參數的值。
設定多個分區的起始Key
程式碼範例
-
數值型指定分區 (根據資料特徵)
建立寬表時預定義5個分區的起始Key,表建立好後預設包含6個預分區。
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'); -
字串型指定分區 (根據資料特徵)
CREATE TABLE your_table ( address VARCHAR NOT NULL, col1 VARCHAR, PRIMARY KEY (address) ) WITH ( SPLITKEYS = '0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff' ); -
指定演算法
CREATE TABLE your_table2 ( address VARCHAR NOT NULL, col1 VARCHAR, PRIMARY KEY (address) ) WITH ( NUMREGIONS = 256, SPLITALGO = 'HexStringSplit' );
結果驗證
-
您可以執行
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))')); -
建立支援點類型(Point)的表,僅支援寫入點資料。
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)); -
建立支援面類型(Polygon)的表,僅支援寫入面資料。
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))')); -
建立支援線類型(LineString)的表,僅支援寫入線資料。
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)))')); -
建立由多個空間資料類型(Geometry)的列組成的表。
CREATE TABLE mix(gid INT, pt GEOMETRY(POINT), ply GEOMETRY(POLYGON), PRIMARY KEY(gid));