全部產品
Search
文件中心

Lindorm:CREATE TABLE

更新時間:Jul 06, 2024

本文介紹建立時空資料表的文法。

文法

create_table_statement ::=  CREATE TABLE [ IF NOT EXISTS ] table_name
                            '('
                                column_definition
                                ( ',' column_definition )*
                                 ',' [constraint pk]  PRIMARY KEY '(' primary_key ')' 
                            ')' WITH [ table_options ]
column_definition      ::=  column_name lql_type 
primary_key            ::=  primary_item [ ',' primary_item ]
primary_item           ::=  column_name (ASC|DESC)
                            | [z-order] '(' [ column_name ( ',' column_name )* ] ')'
說明

建立表語句支援IF NOT EXISTS,其中主鍵由某個或某幾個列組合而成。

使用說明

表名(table_identifier)

關於表名的設定,您需要注意以下內容:

  • 可包含數字、大寫英文字元、小寫英文字元、半形句號(.)、中劃線(-)和底線(_)。

  • 表名不能以半形句號(.)或中劃線(-)開頭。

  • 表名的長度為1~255字元。

列定義(column_definition

文法要素

是否必填

使用說明

列名(column_identifier)

  • 可包含數字、大寫英文字元、小寫英文字元、半形句號(.)、中劃線(-)和底線(_)。

  • 不允許使用系統保留關鍵字作為列名。

  • 長度不能超過255位元組。

資料類型(data_type)

支援的資料類型,請參見資料類型

重要

建立時序表時,如果需要使用時間戳(TIMESTAMP)資料類型,請注意以下幾點:

  • 只能指定一列為TIMESTAMP類型。

  • 時序引擎對於時間戳記的編碼和解析,統一按照北京時間(GMT+8)來進行。

  • 在一些較舊的系統中,其Unix時間戳記仍然是按照32位進行處理。這類時間戳記寫入Lindorm時序引擎前建議乘以1000。如果不加轉換地將這些時間戳記直接寫入時序引擎,將會引起語義解釋上的偏差。例如,時間戳記為1641009600,在較舊系統中會被解釋為2022-01-01 12:00:00,但在Lindorm時序引擎中則會被解釋為1970-01-20 07:50:09(GMT+8) 

NULL約束

列的值是否允許為NULL。

重要

目前Lindorm SQL不會進行NULL約束的校正,該校正工作是由儲存引擎執行的。

NULL約束的校正方式取決於儲存引擎的校正規則,不同儲存引擎的校正規則不同,因此在使用過程中可能會出現已指定NOT NULL但仍可寫入NULL的情況。

為保證資料能夠正常寫入,請遵循以下統一要求:

  • 主鍵列不允許為空白,即在建表時,主鍵列必須指定NOT NULL。

  • 對於非主鍵列,不建議在非主鍵列的定義中指定NOT NULL。

主鍵(primary_key)

主鍵是表中資料的唯一標識,由一列或多列組成,建表時必須指定主鍵PRIMARY KEY。

在使用CREATE TABLE語句建表時,需要注意以下內容:

引擎類型

主鍵使用說明

寬表引擎

  • 單個主鍵列的最大長度為2 KB。

  • 所有主鍵列的長度之和不能超過30 KB。

  • 單個非主鍵列的最大長度不能超過2 MB。

時序引擎

  • 時序表的主鍵列中資料類型為VARCHAR的列又被稱作標籤(TAG)列,資料類型為TIMESTAMP的列又被稱為時間戳記列

  • 主鍵列的資料類型必須是VARCHAR或TIMESTAMP類型。

  • 主鍵列可以包含一個或多個VARCHAR類型的列,但只能包含一個TIMESTAMP類型的列。

  • 在時序表中建議選擇資料來源的唯一標識作為PRIMARY KEY,例如物聯網情境中的裝置ID,車連網情境中的車輛唯一標識,監控情境中的應用ID或ip:port等。更多內容,請參見PRIMARY KEY設計的最佳實務

分區(partition_definition

時序引擎支援分區。在時序表中,用作PARTITION BY的列必須是主鍵定義中的VARCHAR列

建表時,您可以通過PARTITION BY HASH(column1, column2, ..., columnN)語句,顯示指定一個或多個列為表進行Hash分區。例如:PARTITION BY HASH(c1, p1)

表屬性(table_options)

寬表引擎支援表屬性(table_options)。您可以通過WITH關鍵字添加以下表屬性:

選項

類型

描述

COMPRESSION

STRING

表的壓縮演算法。可選的壓縮演算法分別是:

  • SNAPPY

  • ZSTD

  • LZ4

說明

寬表引擎2.3.4版本前預設未指定壓縮演算法,寬表引擎2.3.4及以後的版本預設壓縮演算法為ZSTD。

TTL

INT

資料有效期間,單位為秒(s)。

說明
  • 預設TTL選項為空白,即資料不會到期。

  • 您可以通過在建表語句中添加TTL=<指定時間>為表設定資料有效期間,也可以通過將TTL修改為空白字串來取消資料有效期間。具體用法可參見樣本

COMPACTION_MAJOR_PERIOD

LONG

系統執行major compaction的周期 ,單位為毫秒(ms)。具體用法可參見指定Major Compaction周期

說明

預設值:Math.Min(TTL,1728000000ms)。如果不設定TTL,系統預設該參數值為20天(20*24*60*60*1000ms=1728000000ms)。

MUTABILITY

STRING

索引相關,表示對主表的寫入模式進行分類。預設值為MUTABLE_LATEST。

所有取值如下:

  • IMMUTABLE

  • IMMUTABLE_ROWS

  • MUTABLE_LATEST

  • MUTABLE_ALL

取值的詳細說明,請參見高效能原生二級索引

重要

建立索引表後,MUTABILITY參數的值不支援修改。

CONSISTENCY

STRING

表的一致性。預設主表和索引表最終一致,包括以下兩種層級:

  • eventual:預設值。表示在某個時間點後主表和索引表最終保持一致。

  • strong:表示強一致性。在任意時刻,所有表中的資料是同步一致的。

重要

建立索引表後,CONSISTENCY參數的值不支援由strong修改為eventual。例如:

建立主表時設定參數CONSISTENCY的值為eventual。建立索引表後,您可以將CONSISTENCY參數修改為strong,但修改為strong後不支援將CONSISTENCY的值改回eventual

NUMREGIONS

INT

預先設定建表時的Region數。

CHS

INT

冷熱分界線,單位為秒。

說明
  • 設定冷熱分界線需要開通冷儲存功能,功能介紹和開通方式參考冷熱分離介紹

  • 設定冷熱分界線選項時,必須同時設定CHS_L2='storagetype=COLD'

STARTKEY和ENDKEY

與PRIMARY KEY中第一個列的資料類型相同

預先設定建表的Region分區起止Key。

說明
  • 如果指定STARTKEY和ENDKEY,必須與NUMREGIONS同時指定。如果在未指定NUMREGIONS的情況下指定STARTKEY和ENDKEY將不會產生實際效果。

  • STARTKEY和ENDKEY中指定的字串常量值將會隱式轉換為PRIMARY KEY中的第一個列的類型用作分區的起止Key,且當前僅支援對以下類型指定STARTKEY和ENDKEY。

    • SMALLINT

    • INTEGER

    • BIGINT

    • CHAR

    • VARCHAR

    • FLOAT

    • DOUBLE

SPLITKEYS

與PRIMARY KEY中第一個列的資料類型相同

預先設定表的全部預分區的起始Key。

說明
  • SPLITKEYS從寬表引擎2.5.4版本開始支援。

  • 指定字串形式的SPLITKEYS值中通過半形逗號(,)區分各個預分區的起始Key。置於成對雙引號中的逗號將會被視作一般字元。

  • SPLITKEYS無法與NUMREGIONS、STARTKEY以及ENDKEY一同使用。

  • 與STARTKEY和ENDKEY一樣,指定的字串常量值將會隱式轉換為PRIMARY KEY中的第一個列的類型用作分區的起始Key。僅支援以下資料類型。

    • SMALLINT

    • INTEGER

    • BIGINT

    • CHAR

    • VARCHAR

    • FLOAT

    • DOUBLE

SPLITALGO

STRING

定義預分區的分裂演算法。目前僅支援以下分裂演算法:

  • HexStringSplit:使用十六進位格式的位元組對主鍵進行切分。

  • UniformSplit:使用原始的Byte值進行平均切分。

DYNAMIC_COLUMNS

STRING

是否開啟動態列。取值:

  • True:是。

  • False:否,預設值。

說明

動態列僅支援Varbinary類型。關於動態列的介紹,請參見動態列

VERSIONS

STRING

列值保留的版本數。取值為大於等於1的整數。預設值為1,表示保留一個版本。Lindorm支援列值保留多個版本,多版本管理的詳細說明,請參見多版本資料管理

重要

VERSIONS參數的值過大可能會影響資料的查詢和儲存效能,請盡量避免設定過大的值。建議將VERSIONS的值設定1。

BLOB_BUCKET_NAME

STRING

為包含BLOB列的表建立BUCKET。取值為自訂的BUCKET名稱。

BUCKET名稱需遵循以下規則:

  • 只能包含小寫字母、數字、半形句號(.)、中劃線(-)。

  • 長度為3~63個字元。

  • 禁止以中劃線(-)作為BUCKET名稱的開頭或結尾。

  • 名稱中不允許包含連續的半形句號(.)。

說明
  • BLOB_BUCKET_NAME從寬表2.6.4版本開始支援。

  • 如果建表時未設定BLOB列,但設定了BLOB_BUCKET_NAME屬性,則系統不會觸發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';

樣本

  • 建立支援任意空間資料類型(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));