创建table。

语法

create_table_statement ::=  CREATE TABLE [ IF NOT EXISTS ] table_name
                            '('
                                column_definition
                                ( ',' column_definition )*
                                [ ',' PRIMARY KEY '(' primary_key ')' ]
                            ')' [ WITH table_options ]
column_definition      ::=  column_name cql_type [ STATIC ] [ PRIMARY KEY]
primary_key            ::=  partition_key [ ',' clustering_columns ]
partition_key          ::=  column_name
                            | '(' column_name ( ',' column_name )* ')'
clustering_columns     ::=  column_name ( ',' column_name )*
table_options          ::=  CLUSTERING ORDER BY '(' clustering_order ')' [ AND options ]
                            | options
clustering_order       ::=  column_name (ASC | DESC) ( ',' column_name (ASC | DESC) )*

说明

Lindorm CQL表具有名称,并且由一组行组成。创建table等于定义行将组成哪些列,哪些列组成主键以及该表的可选选项。除非使用IF NOT EXISTS指令,否则尝试创建一个已经存在的表将返回错误。如果使用该表,则该语句将成为无操作(如果该表已存在)。

Lindorm CQL表中的每一行都有一组预定义列,这些预定义列在创建表时定义(或稍后使用alter语句添加)。

column_definition主要由定义的列的名称和类型组成,它限制了该列接受哪些值。此外,列定义可以具有以下修饰符:
  • STATIC:它将列声明为静态列。
  • PRIMARY KEY:它声明该列是表主键的唯一组成部分。

在一个表中,一行由其PRIMARY KEY唯一标识,因此所有表都必须定义一个PRIMARY KEY(只有一个)。PRIMARY KEY定义由表中定义的一列或多列组成。在语法上,主关键字定义为关键字PRIMARY KEY,后跟用括号括起来的列名称的列表,该列名称用括号括起来,但是如果主键只有一列,则可以用PRIMARY KEY关键字替换该列定义。主键定义中列的顺序很重要。

Lindorm CQL主键由两部分组成:
  • partition key:它是主键定义的第一部分。它可以是单个列,或者使用附加的括号可以是多个列。一个表总是至少有一个分区键。
  • clustering columns:这些是主键定义的第一部分之后的列,这些列的顺序定义了聚类顺序,Lindorm CQL中允许不定义clustering columns
PRIMARY KEY定义的一些示例:
  • PRIMARY KEY(a):a是分区键,没有聚类列。
  • PRIMARY KEY(a,b,c):a是分区键,b和c是聚簇列。
  • PRIMARY KEY((a,b),c):a和b组成分区键(通常称为复合分区键),而c是群集列。

在Lindorm CQL中,PRIMARY KEY具有较强的意义,partition keyclustering columns组成PRIMARY KEY,单独的partition keyclustering columns不具有独立使用的意义。

在表中,Lindorm CQL定义分区的概念。分区就是一组共享相同分区键值的行。请注意,如果分区键由多个列组成,则行仅属于同一分区,并且所有分区键列的值都相同.例如,给定以下表定义和内容:
CREATE TABLE persioninfo (
    a int,
    b int,
    c int,
    d int,
    PRIMARY KEY ((a, b), c, d)
);

SELECT * FROM persioninfo;
   a | b | c | d
  ---+---+---+---
   0 | 0 | 0 | 0    // row 1
   0 | 0 | 1 | 1    // row 2
   0 | 1 | 2 | 2    // row 3
   0 | 1 | 3 | 3    // row 4
   1 | 1 | 4 | 4    // row 5

Lindorm CQL中,partition key以及clustering columns共同组成PRIMARY KEY,他们的地位是等价的,Lindorm CQL中partition keycluster column组合在一起共同决定一条数据属于哪个节点,而不是CQL中由partition key单独决定一条数据属于哪个节点,例如上述例子中row1和row2在Lindorm CQL中可以确定是在一个节点中,但是在Lindorm CQL中并不能保证,这是Lindorm CQL与传统CQL的较大区别。

示例

CREATE TABLE tb (name text PRIMARY KEY , age int);   //默认创建以name为主键的表。
CREATE TABLE ttltb (name text PARIMARY KEY, age int) WITH defult_time_to_live = 1000;  //设置表的ttl时间是1000s。
CREATE TABLE cptb (name text PRIMARY KEY, age int) WITH WITH compression = {'sstable_compression': 'LZ4Compressor'};   //设置压缩为LZ4压缩;默认是SNAPPY。
CREATE TABLE hct ( name text PRIMARY KEY , age int  ) WITH extensions = {'COLD_BOUNDARY':'10'};  //设置lindorm的冷热分离的时间线是10s。

Lindorm CQL Table暂不支持的定义功能

partition key:确定数据分布式从属的对应节点,Lindorm CQL不能由单一的partition key确定该行数据从属的物理节点。

STATIC列:传统Apache Cassandra CQL中支持定义某一个列为STATIC,然后该列的数据一旦写入,数据会被所有行共享。

支持的table_Option列表

Lindorm CQL的table_options和Cassandra的table_options有一定差异,Lindorm CQL目前支持如下的选项设置:
选项 类型 描述
default_time_to_live int 表的默认到期时间(“ TTL”),以秒为单位。默认值为0。
compression map 可以设置对应文件(sstable)的compression算法,支持LZ4、ZSTD、SNAPPY算法。具体请参考下文Compresion介绍。
extensions map 支持扩展设置,包括设置是否使用冷存储、使用冷热分离、表的一致性级别等属性。具体请参考下文extensions介绍。

compression

Lindorm CQL支持如下几种可配置的压缩算法,各个压缩算法的系数暂时使用默认参数进行设置。
  • LZ4(LZ4Compressor)。创建LZ4压缩的表如下:
    CREATE TABLE persioninfo (
       id int,
       name text,
       address text,
       PRIMARY KEY (id, name)
    ) with compression = {'class': 'LZ4Compressor'};
  • ZSTD(ZstdCompressor)。创建ZSTD压缩的表如下:
    CREATE TABLE persioninfo (
       id int,
       name text,
       address text,
       PRIMARY KEY (id, name)
    ) with compression = {'class': 'ZstdCompressor'};
  • SNAPP(SnappyCompressor)。创建SNAPPY压缩的表如下:
    CREATE TABLE persioninfo (
       id int,
       name text,
       address text,
       PRIMARY KEY (id, name)
    ) with compression = {'class': 'SnappyCompressor'};
说明 上述表的属性我们也可以使用ALTER TABLE语法进行修改设置。

extensions

对于Lindorm的特有属性我们通过extensions扩展属性进行设置,扩展属性如下:
  • 冷存储。关键字为STORAGE_TYPE,配置值为COLD表示冷存储,DEFAULT表示使用默认热存储。
    CREATE TABLE persioninfo (name text PRIMARY KEY, age int) WITH extensions = {'STORAGE_POLICY' : 'COLD'};  //建表指定表为冷存储。
    ALTER TABLE persioninfo WITH extensions = {'STORAGE_POLICY' : 'DEFAULT'};  //修改表属性为热存储。
  • 冷热分离。关键字为COLD_BOUNDARY,在冷热分离使用过程中,无需把表或列簇的属性设置为COLD,如果已经把列簇的属性设置为了COLD,请您将冷存储的属性去除,具体请参考使用冷存储
    CREATE TABLE persioninfo (name text PRIMARY KEY, age int) with extensions = {'COLD_BOUNDARY':'86400'};  //建表指定冷热分离时间线为1天(86400秒),超过时间线数据被写到冷介质。
    ALTER TABLE persioninfo with extensions = {'COLD_BOUNDARY':''};    //取消冷热分离。
    ALTER TABLE persioninfo with extensions = {'COLD_BOUNDARY':'1000'};   //修改时间线为1000s。
  • CONSISTENCY_TYPE:对于lindorm多zone场景下,设置表的一致性级别,有eventual、timtstamp、basic、strong四种级别。
    CREATE TABLE persioninfo (name text PRIMARY KEY, age int) with extensions = {'CONSISTENCY_TYPE':'strong'};  //建表一致性级别为strong。
    ALTER TABLE persioninfo with extensions = {'CONSISTENCY_TYPE':'eventual'};  //修改一致性级别为eventual。
  • Mutability:用户在使用二级索引、search index之前需要设置Mutability,取值:IMMUTABLE、IMMUTABLE_ROWS(CONSISTENCY_TYPE必须为strong),MUTABLE_LATEST(CONSISTENCY_TYPE必须为strong),MUTABLE_ALL(建表默认的级别,CONSISTENCY_TYPE必须为strong)。
    CREATE TABLE persioninfo (name text PRIMARY KEY, age int) with extensions = {'MUTABILITY':'IMMUTABLE'};  //建表指定mutability为IMMUTABLE。
    ALTER TABLE persioninfo with extensions = {'MUTABILITY':'MUTABLE_LATEST'};   //修改表mutability为MUTABLE_LATEST。

暂不支持的table_Option列表

选项 类型 描述
comment string 表示对表的描述。默认值为f。
speculative_retry simple simple 默认值为99PERCENTILE。
cdc boolean 在表上创建一个更改数据捕获(CDC)日志。默认值为false。
gc_grace_seconds int 等待垃圾收集墓碑(删除标记)之前的时间。默认值为86400。
bloom_filter_fp_chance float 稳定布隆过滤器误报的目标概率。所述布隆过滤器的大小将确定所提供的概率,因此降低此值会影响内存中和磁盘上布隆过滤器的大小。默认值为0.00075。
compaction map 默认值为STCS策略。
caching map
memtable_flush_period_in_ms map 默认值为0。
read_repair int 默认值为BLOCKING。