创建表(CREATE TABLE)

Syntax

CreateTableStmt ::=
    'CREATE' 'TABLE' IfNotExists TableName ( 
      TableElementList CreateTableSelectOpt | LikeTableWithOrWithoutParen ) OnCommitOpt

IfNotExists ::=
    ('IF' 'NOT' 'EXISTS')?

TableName ::=
    Identifier ('.' Identifier)?
    
TableElementList ::=
    TableElement ( ',' TableElement )*

TableElement ::=
    ColumnDef
|   ColumnIndex

CREATE TABLE 语句用于创建一张表。同一个数据库下,表名在必须是唯一的,在同一个数据库下,重复创建同名表,会发生错误。

建表语句中需要定义table_element列表。table_element分为列描述ColumnDefConstraint。OpenMLDB要求table_element列表中至少包含一个ColumnDef

相关语法元素

列描述ColumnDef(必要)

一张表中包含一个或多个列。每一列的列描述ColumnDef描述了列名、列类型以及类配置。

  • 列名:列在表中的名字。同一张表内的列名必须是唯一的。

  • 列类型:列的类型。想要了解OpenMLDB支持的数据类型,可以参考数据类型

  • 列约束配置:

    • NOT NULL: 配置列的不允许为空值。

    • DEFAULT: 配置列默认值。NOT NULL的属性会同时配置DEFAULT默认值,这样的话,查入数据时,若没有定义该列的值,会插入默认值。若配置NOT NULL属性且没有配置DEFAULT值,插入语句中未定义改列值时,OpenMLDB会抛出错误。

Example: 创建一张表

将当前数据库设为db1,在当前数据库中创建一张表t1,包含列col0,列类型为STRING

指定在数据库db1中创建一张表t1,包含列col0,列类型为STRING

Example: 创建一张表,配置列不允许为空NOT NULL

Example: 创建一张表,配置列配置默认值

Example: 在同一个数据库下重复创建同名表

列索引ColumnIndex(可选)

索引可以被数据库搜索引擎用来加速数据的检索。 简单说来,索引就是指向表中数据的指针。配置一个列索引一般需要配置索引key,索引时间列, TTL和TTL_TYPE。其中索引key是必须配置的,其他配置项都为可选。下表列出了列索引配置项:

配置项
描述
用法示例

KEY

索引列(必选)。OpenMLDB支持单列索引,也支持联合索引。当KEY=一列时,配置的是单列索引。当KEY=多列时,配置的是这几列的联合索引,具体来说会将几列按顺序拼接成一个字符串作为索引。

单列索引:INDEX(KEY=col1) 联合索引:INDEX(KEY=(col1, col2))

TS

索引时间列(可选)。同一个索引上的数据将按照时间索引列排序。当不显式配置TS时,使用数据插入的时间戳作为索引时间。

INDEX(KEY=col1, TS=std_time)。索引列为col1,col1相同的数据行按std_time排序。

TTL_TYPE

淘汰规则(可选)。包括:ABSOLUTE, LATEST, ABSORLAT, ABSANDLAT这四种类型。当不显式配置TTL_TYPE时,默认使用ABSOLUTE过期配置。

具体用法可以参考“TTL和TTL_TYPE的配置细则”

TTL

最大存活时间/条数()可选。不同的TTL_TYPE有不同的配置方式。当不显式配置TTL时,TTL=0TTL为0表示不设置淘汰规则,OpenMLDB将不会淘汰记录。

TTL和TTL_TYPE的配置细则:

TTL_TYPE
TTL
描述
用法示例

ABSOLUTE

TTL的值代表过期时间。配置值为时间段如100m, 12h, 1d, 365d。最大可以配置的过期时间为15768000m(即30年)

当记录过期时,会被淘汰。

INDEX(KEY=col1, TS=std_time, TTL_TYPE=absolute, TTL=100m) OpenMLDB将会删除100分钟之前的数据。

LATEST

TTL的值代表最大存活条数。即同一个索引下面,最大允许存在的数据条数。最大可以配置1000条

记录超过最大条数时,会被淘汰。

INDEX(KEY=col1, TS=std_time, TTL_TYPE=LATEST, TTL=10)。OpenMLDB只会保留最近10条记录,删除以前的记录。

ABSORLAT

配置过期时间和最大存活条数。配置值是一个2元组,形如(100m, 10), (1d, 1)。最大可以配置(15768000m, 1000)

当且仅当记录过期记录超过最大条数时,才会淘汰。

INDEX(key=c1, ts=c6, ttl=(120min, 100), ttl_type=absorlat)。当记录超过100条,或者当记录过期时,会被淘汰

ABSANDLAT

配置过期时间和最大存活条数。配置值是一个2元组,形如(100m, 10), (1d, 1)。最大可以配置(15768000m, 1000)

当记录过期记录超过最大条数时,记录会被淘汰。

INDEX(key=c1, ts=c6, ttl=(120min, 100), ttl_type=absandlat)。当记录超过100条,而且记录过期时,会被淘汰

Example: 创建一张带单列索引的表

Example: 创建一张带联合列索引的表

Example: 创建一张带单列索引+时间列的表

Example: 创建一张带单列索引+时间列的TTL type为abusolute表,并配置ttl为30天

Example: 创建一张带单列索引+时间列的TTL type为latest表,并配置ttl为1

Example: 创建一张带单列索引+时间列的TTL type为absANDlat表,并配置过期时间为30天,最大留存条数为10条

Example: 创建一张带单列索引+时间列的TTL type为absORlat表,并配置过期时间为30天,最大留存条数为10条

表属性TableOptions(可选)

配置项
描述
用法示例

PARTITIONNUM

配置表的分区数。OpenMLDB将表分为不同的分区块来存储。分区是OpenMLDB的存储、副本、以及故障恢复相关操作的基本单元。不显式配置时,PARTITIONNUM默认值为8。

OPTIONS (PARTITIONNUM=8)

REPLICANUM

配置表的副本数。请注意,副本数只有在Cluster OpenMLDB中才可以配置。

OPTIONS (REPLICANUM=3)

DISTRIBUTION

配置分布式的节点endpoint配置。一般包含一个Leader节点和若干follower节点。(leader, [follower1, follower2, ..])。不显式配置是,OpenMLDB会自动的根据环境和节点来配置DISTRIBUTION

DISTRIBUTION = [ ('127.0.0.1:6527', [ '127.0.0.1:6528','127.0.0.1:6529' ])]

Example: 创建一张带表,配置分片数为8,副本数为3(例子需要补充完整)@denglong需要提供一个带例子以及desc table的结果

相关SQL

CREATE DATABASE

USE DATABASE

Last updated