Cassandra 文档

版本

您正在查看预发布版本的文档。

数据定义

CQL 将数据存储在中,表的模式定义了表中数据的布局。表位于键空间中。键空间定义了应用于所有键空间表的选项。 复制策略 是一个重要的键空间选项,复制因子也是如此。一个通用的规则是每个应用程序一个键空间。对于一个集群来说,通常只为一个活动的应用程序定义一个键空间。

本节介绍用于创建、修改和删除这些键空间和表的语句。

通用定义

键空间和表的名称由以下语法定义

keyspace_name::= name
table_name::= [keyspace_name '.' ] name
name::= unquoted_name | quoted_name
unquoted_name::= re('[a-zA-Z_0-9]\{1, 48}')
quoted_name::= '"' unquoted_name '"'

键空间和表名应仅包含字母数字字符,不能为空,大小限制为 48 个字符(此限制主要用于避免文件名(可能包含键空间和表名)超过某些文件系统的限制)。默认情况下,键空间和表名不区分大小写(myTable 等同于 mytable),但可以使用双引号强制区分大小写("myTable"mytable 不同)。

此外,表始终是键空间的一部分,表名可以通过其所属的键空间进行完全限定。如果未进行完全限定,则假定该表位于当前键空间中(请参阅 USE 语句)。

此外,列的有效名称定义为

column_name::= identifier

我们还定义了在以下部分中使用的语句选项的概念

options::= option ( AND option )*
option::= identifier '=' ( identifier
	| constant
	| map_literal )

CREATE KEYSPACE

使用 CREATE KEYSPACE 语句创建键空间

create_keyspace_statement::= CREATE KEYSPACE [ IF NOT EXISTS ] keyspace_name
	WITH options

例如

CREATE KEYSPACE excelsior
   WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};

CREATE KEYSPACE excalibur
   WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : 1, 'DC2' : 3}
   AND durable_writes = false;

尝试创建已存在的键空间将返回错误,除非使用 IF NOT EXISTS 选项。如果使用此选项,如果键空间已存在,则该语句将成为无操作。

支持的 options

name kind mandatory default description

replication

map

yes

n/a

键空间要使用的复制策略及其选项(请参阅以下详细信息)。

durable_writes

simple

no

true

是否对该键空间使用提交日志进行更新(自行承担风险禁用此选项!)。

replication 属性是必需的,必须包含定义所需 复制策略 类的 'class' 子选项。其余子选项取决于使用的复制策略。默认情况下,Cassandra 支持以下 'class'

SimpleStrategy

一种简单的策略,它为数据定义一个复制因子,以便将数据分散到整个集群中。这通常不是生产环境中的明智选择,因为它不尊重数据中心布局,会导致查询延迟差异很大。对于生产环境,请使用 NetworkTopologyStrategySimpleStrategy 支持一个必需的参数

sub-option type since description

'replication_factor'

int

all

每个范围要存储的副本数量

NetworkTopologyStrategy

一种生产就绪的复制策略,它独立地为每个数据中心设置复制因子。其余子选项是键值对,其中键设置为数据中心名称,其值为关联的复制因子。选项

sub-option type description '<datacenter>'

int

在提供的数据中心中每个范围要存储的副本数量。

'replication_factor'

int

在以后更改键空间并更改 replication_factor 时,自动扩展将仅出于安全原因添加新的数据中心,不会更改现有数据中心或删除任何数据中心,即使它们不再位于集群中。如果您想在设置 replication_factor 时删除数据中心,请明确将要设置为零副本的数据中心设置为零。

使用两个数据中心(DC1DC2)自动扩展数据中心的示例:

CREATE KEYSPACE excalibur
    WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor' : 3};

DESCRIBE KEYSPACE excalibur;

将导致

CREATE KEYSPACE excalibur WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': '3', 'DC2': '3'} AND durable_writes = true;

自动扩展并覆盖数据中心的示例

CREATE KEYSPACE excalibur
   WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor' : 3, 'DC2': 2};

DESCRIBE KEYSPACE excalibur;

将导致

CREATE KEYSPACE excalibur WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': '3', 'DC2': '2'} AND durable_writes = true;

在使用 replication_factor 时排除数据中心的示例

CREATE KEYSPACE excalibur
   WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor' : 3, 'DC2': 0};

DESCRIBE KEYSPACE excalibur;

将导致

CREATE KEYSPACE excalibur WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': '3'} AND durable_writes = true;

如果已启用 瞬时复制,则可以通过以下格式定义复制因子来为 SimpleStrategyNetworkTopologyStrategy 配置瞬时副本:'<total_replicas>/<transient_replicas>'

例如,此键空间将在 DC1 中有 3 个副本,其中 1 个是瞬时的,在 DC2 中有 5 个副本,其中 2 个是瞬时的

CREATE KEYSPACE some_keyspace
   WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : '3/1'', 'DC2' : '5/2'};

USE

USE 语句将当前键空间更改为指定的键空间。CQL 中的许多对象都绑定到键空间(表、用户定义类型、函数等),并且当前键空间是在查询中未完全限定名称(没有前缀键空间名称)时使用的默认键空间。USE 语句指定要使用的键空间作为参数

use_statement::= USE keyspace_name

使用 CQL

USE excelsior;

ALTER KEYSPACE

ALTER KEYSPACE 语句修改键空间的选项

alter_keyspace_statement::= ALTER KEYSPACE [ IF EXISTS ] keyspace_name
	WITH options

例如

ALTER KEYSPACE excelsior
    WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4};

如果键空间不存在,则该语句将返回错误,除非使用 IF EXISTS,在这种情况下,该操作将成为无操作。支持的选项与 创建键空间 的选项相同。

DROP KEYSPACE

使用 DROP KEYSPACE 语句删除键空间

drop_keyspace_statement::= DROP KEYSPACE [ IF EXISTS ] keyspace_name

例如

DROP KEYSPACE excelsior;

删除键空间会导致立即、不可逆地删除该键空间,包括所有表、用户定义类型、用户定义函数以及这些表中包含的所有数据。

如果键空间不存在,则该语句将返回错误,除非使用 IF EXISTS,在这种情况下,该操作将成为无操作。

CREATE TABLE

使用 CREATE 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 ] [ column_mask ] [ PRIMARY KEY]
column_mask::= MASKED WITH ( DEFAULT | function_name '(' term ( ',' term )* ')' )
primary_key::= partition_key [ ',' clustering_columns ]
partition_key::= column_name  | '(' column_name ( ',' column_name )* ')'
clustering_columns::= column_name ( ',' column_name )*
table_options::= COMPACT STORAGE [ AND table_options ]
	| CLUSTERING ORDER BY '(' clustering_order ')'
	[ AND table_options ]  | options
clustering_order::= column_name (ASC | DESC) ( ',' column_name (ASC | DESC) )*

例如,以下是一些用于创建表的 CQL 语句

CREATE TABLE monkey_species (
    species text PRIMARY KEY,
    common_name text,
    population varint,
    average_size int
) WITH comment='Important biological records';

CREATE TABLE timeline (
    userid uuid,
    posted_month int,
    posted_time uuid,
    body text,
    posted_by text,
    PRIMARY KEY (userid, posted_month, posted_time)
) WITH compaction = { 'class' : 'LeveledCompactionStrategy' };

CREATE TABLE loads (
    machine inet,
    cpu int,
    mtime timeuuid,
    load float,
    PRIMARY KEY ((machine, cpu), mtime)
) WITH CLUSTERING ORDER BY (mtime DESC);

CQL 表具有名称,并由一组组成。创建表相当于定义每行将具有的 ,哪些列构成 主键,以及为表定义的 选项

尝试创建已存在的表将返回错误,除非使用 IF NOT EXISTS 指令。如果使用此指令,如果表已存在,则该语句将成为无操作。

列定义

CQL 表中的每一行都将具有在表创建时定义的预定义列。可以使用 alter 语句 在以后添加列。

column_definition 由列的名称及其 类型 组成,限制了该列接受的值。此外,列定义可以具有以下修饰符

  • STATIC:将列声明为 静态列

  • PRIMARY KEY:将列声明为表的 主键 的唯一组成部分

静态列

在表定义中,某些列可以声明为STATIC。静态列将由属于同一分区(具有相同的分区键)的所有行“共享”。

例如

  • 代码

  • 结果

CREATE TABLE t (
    pk int,
    t int,
    v text,
    s text static,
    PRIMARY KEY (pk, t)
);
INSERT INTO t (pk, t, v, s) VALUES (0, 0, 'val0', 'static0');
INSERT INTO t (pk, t, v, s) VALUES (0, 1, 'val1', 'static1');
SELECT * FROM t;
   pk | t | v      | s
  ----+---+--------+-----------
   0  | 0 | 'val0' | 'static1'
   0  | 1 | 'val1' | 'static1'

如您所见,s 值对于分区中的两行(分区键为 pk,两行都在同一分区中)都是相同的(static1):第二次插入会覆盖 s 的值。

使用静态列有以下限制

  • 没有聚簇列的表不能有静态列。在没有聚簇列的表中,每个分区只有一行,因此每列本质上都是静态的。

  • 只有非主键列可以是静态的。

主键

在一个表中,一行由其PRIMARY KEY唯一标识,因此所有表都**必须**定义一个 PRIMARY KEY。PRIMARY KEY 由表中定义的一个或多个列组成。在语法上,主键由短语 PRIMARY KEY 后跟括号内用逗号分隔的列名列表定义。如果主键只有一列,则可以将 PRIMARY KEY 短语添加到表定义中的该列。主键定义中列的顺序定义了分区键和聚簇列。

CQL 主键由两部分组成

分区键
  • 它是主键定义的第一个组件。它可以是单个列,也可以使用额外的括号,可以是多个列。表必须至少有一个分区键,最小的表定义是

    CREATE TABLE t (k text PRIMARY KEY);
聚簇列
  • 这些列是主键定义中分区键后面的列。这些列的顺序定义了聚簇顺序

以下是一些主键定义的示例

  • PRIMARY KEY (a)a 是单个分区键,没有聚簇列

  • PRIMARY KEY (a, b, c)a 是单个分区键,bc 是聚簇列

  • PRIMARY KEY ((a, b), c)ab 组成复合分区键,c 是聚簇列

如上所述,主键唯一标识表中的一行。这种唯一性的结果是,如果使用相同的主键插入另一行,则会发生UPSERT,并且具有相同主键的现有行将被替换。不属于主键的列不能定义唯一性。

分区键

在一个表中,CQL 定义了分区的概念,该概念定义了数据在 Cassandra 集群中的位置。分区是共享相同分区键值的行的集合。

请注意,如果分区键由多个列组成,则当行在所有这些分区键列中具有相同的值时,这些行属于同一分区。从分区键列计算出一个哈希值,该哈希值定义了分区位置。因此,例如,给定以下表定义和内容

CREATE TABLE t (
    a int,
    b int,
    c int,
    d int,
    PRIMARY KEY ((a, b), c, d)
);
INSERT INTO t (a, b, c, d) VALUES (0,0,0,0);
INSERT INTO t (a, b, c, d) VALUES (0,0,1,1);
INSERT INTO t (a, b, c, d) VALUES (0,1,2,2);
INSERT INTO t (a, b, c, d) VALUES (0,1,3,3);
INSERT INTO t (a, b, c, d) VALUES (1,1,4,4);
SELECT * FROM t;

将导致

 a | b | c | d
---+---+---+---
 0 | 0 | 0 | 0 	(1)
 0 | 0 | 1 | 1
 0 | 1 | 2 | 2	(2)
 0 | 1 | 3 | 3
 1 | 1 | 4 | 4  (3)

(5 rows)
1 行 1 和 2 在同一分区中,因为列 ab 都为零。
2 行 3 和 4 在同一分区中,但分区不同,因为列 a 为零,列 b 在两行中都为 1。
3 行 5 独自在一个第三个分区中,因为列 ab 都为 1。

请注意,表始终具有分区键,如果表没有聚簇列,则该表的每个分区都只有一行。因为分区键(复合或其他)标识单个位置。

分区最重要的属性是,属于同一分区的行都保证存储在同一组副本节点上。换句话说,表的分区键定义了哪些行将在集群中的同一节点上本地化。数据的本地化对于高效检索数据很重要,需要 Cassandra 协调器与尽可能少的节点联系。但是,这种保证有一个反面,所有共享分区键的行都将存储在同一节点上,从而为读写操作创建热点。虽然选择将表行分组的主键有助于批处理更新,并确保更新是原子的并在隔离中完成,但分区必须“恰到好处,既不太大也不太小”。

考虑查询模式并根据查询分配主键的数据建模将具有最低的获取数据延迟。

聚簇列

表的聚簇列定义了该表分区中的聚簇顺序。对于给定的分区,所有行都按该聚簇顺序排序。聚簇列还为表中的行添加了唯一性。

例如,给定

CREATE TABLE t2 (
    a int,
    b int,
    c int,
    d int,
    PRIMARY KEY (a, b, c)
);
INSERT INTO t2 (a, b, c, d) VALUES (0,0,0,0);
INSERT INTO t2 (a, b, c, d) VALUES (0,0,1,1);
INSERT INTO t2 (a, b, c, d) VALUES (0,1,2,2);
INSERT INTO t2 (a, b, c, d) VALUES (0,1,3,3);
INSERT INTO t2 (a, b, c, d) VALUES (1,1,4,4);
SELECT * FROM t2;

将导致

 a | b | c | d
---+---+---+---
 1 | 1 | 4 | 4	(1)
 0 | 0 | 0 | 0
 0 | 0 | 1 | 1
 0 | 1 | 2 | 2
 0 | 1 | 3 | 3

(5 rows)
1 行 1 在一个分区中,行 2-5 在另一个分区中。显示顺序也不同。

仔细观察同一分区中的四行,b 聚簇列定义了这些行显示的顺序。而表的 partition key 将行分组在同一节点上,聚簇列控制这些行在节点上的存储方式。

这种排序允许非常高效地检索分区内的行范围

SELECT * FROM t2 WHERE a = 0 AND b > 0 and b <= 3;

将导致

 a | b | c | d
---+---+---+---
 0 | 1 | 2 | 2
 0 | 1 | 3 | 3

(2 rows)

表选项

CQL 表具有一些可以在创建时设置(并且对于大多数选项,可以在以后更改)的选项。这些选项在WITH 关键字之后指定。

一个重要的选项,在创建后无法更改,CLUSTERING ORDER BY,会影响对表执行查询的方式。值得在这里更详细地讨论。

聚簇顺序

表的聚簇顺序由聚簇列定义。默认情况下,聚簇顺序对于聚簇列的数据类型是升序的。例如,整数从 1、2、…​ n 排序,而文本从 A 到 Z 排序。

CLUSTERING ORDER BY 表选项使用聚簇列的逗号分隔列表,每个列都设置为ASC(用于升序)或DESC(用于_降序_)。如果未设置CLUSTERING ORDER BY 选项,则所有聚簇列的默认值为升序。

此选项基本上是存储引擎的提示,它会更改存储行的顺序。注意设置此选项的后果

  • 它会更改使用没有ORDER BY 子句的SELECT 语句查询时结果的默认升序。

  • 它限制了在该表的SELECT 语句中使用ORDER BY 子句的方式。结果只能按原始聚簇顺序或反向聚簇顺序排序。假设您创建一个具有两个聚簇列 ab 的表,定义为WITH CLUSTERING ORDER BY (a DESC, b ASC)。表上的查询可以使用ORDER BY (a DESC, b ASC)ORDER BY (a ASC, b DESC)。混合顺序,例如ORDER BY (a ASC, b ASC)ORDER BY (a DESC, b DESC) 不会返回预期的顺序。

  • 它会对查询的性能产生影响。反向聚簇顺序的查询比默认的升序查询速度慢。如果您计划主要以降序查询,请使用WITH CLUSTERING ORDER BY () 在表模式中声明聚簇顺序。这种优化对于时间序列很常见,以便从最新到最旧检索数据。

其他表选项

表支持以下选项

选项 kind default description

注释

simple

自由格式的人类可读注释

speculative_retry

simple

99PERCENTILE

推测重试选项

cdc

布尔值

false

在表上创建更改数据捕获 (CDC) 日志

additional_write_policy

simple

99PERCENTILE

speculative_retry 相同

gc_grace_seconds

simple

864000

在垃圾回收墓碑(删除标记)之前等待的时间

bloom_filter_fp_chance

simple

0.00075

sstable 布隆过滤器的误报概率目标。这些布隆过滤器将被调整大小以提供提供的概率,因此降低此值会影响内存和磁盘中布隆过滤器的尺寸。

default_time_to_live

simple

0

表的默认过期时间(“TTL”)以秒为单位

compaction

map

见下文

压缩选项

compression

map

见下文

压缩选项

caching

map

见下文

缓存选项

memtable_flush_period_in_ms

simple

0

Cassandra 将内存表刷新到磁盘之前的时间(以毫秒为单位)

read_repair

simple

BLOCKING

设置读修复行为(见下文)

推测重试选项

默认情况下,Cassandra 读取协调器只查询满足一致性级别的必要副本数量:一致性级别为ONE 时查询一个副本,一致性级别为QUORUM 时查询一个副本,依此类推。speculative_retry 决定协调器何时可以查询其他副本,这是一个有用的操作,当副本速度慢或无响应时。推测重试可以减少延迟。speculative_retry 选项配置快速读取保护,其中协调器发送比满足一致性级别所需的请求更多的请求。

频繁地从其他副本读取可能会损害集群性能。如有疑问,请保留默认值99PERCENTILE

Cassandra 4.0 之前的推测重试策略将单个字符串作为参数

  • NONE

  • ALWAYS

  • 99PERCENTILE (PERCENTILE)

  • 50MS (CUSTOM)

设置推测重试的示例设置了一个自定义值

ALTER TABLE users WITH speculative_retry = '10ms';

此示例使用百分位数进行设置

ALTER TABLE users WITH speculative_retry = '99PERCENTILE';

百分位数设置可能会适得其反。如果单个主机变得不可用,它可能会迫使百分位数上升。p99 的值不会按预期进行推测,因为指定百分位数的值已大幅增加。如果一致性级别设置为ALL,则无论推测重试设置如何,都会查询所有副本。

Cassandra 4.0 支持推测重试值的区分大小写 (CASSANDRA-14293)。例如,将值分配为noneNoneNONE 具有相同的效果。

此外,还添加了以下值

格式 示例 描述

XPERCENTILE

90.5PERCENTILE

协调器记录所有副本的平均每表响应时间。如果副本花费的时间超过该表平均响应时间的X%,则协调器会查询其他副本。X 必须介于 0 到 100 之间。

XP

90.5P

XPERCENTILE 相同

Yms

25ms

如果副本花费的时间超过Y 毫秒才能响应,则协调器会查询其他副本。

MIN(XPERCENTILE,YMS)

MIN(99PERCENTILE,35MS)

一种混合策略,根据计算时的较小值使用指定的百分位数或固定毫秒数。参数为XPERCENTILEXPYms。此设置有助于防止单个缓慢实例的影响。

MAX(XPERCENTILE,YMS) ALWAYS NEVER

MAX(90.5P,25ms)

一种混合策略,根据计算时的较大值使用指定的百分位数或固定毫秒数。

Cassandra 4.0 添加了对混合MIN()MAX()推测重试策略的支持,可以混合匹配MIN()MAX()MIN()MIN()MAX()MAX() (CASSANDRA-14293)。如果表的正常p99小于 50 毫秒(最小值),混合模式仍将推测。但如果p99级别高于最大值,则可以使用该值。在混合值中,一个值必须是固定时间(毫秒)值,另一个值必须是百分位数。

为了说明各种变化,以下示例都是有效的

min(99percentile,50ms)
max(99p,50MS)
MAX(99P,50ms)
MIN(99.9PERCENTILE,50ms)
max(90percentile,100MS)
MAX(100.0PERCENTILE,60ms)

additional_write_policy设置指定将廉价的仲裁写入升级为包含瞬态副本的阈值。

压缩选项

compaction选项必须至少定义'class'子选项,以指定要使用的压缩策略类。支持的类为

  • 'SizeTieredCompactionStrategy'STCS(默认)

  • 'LeveledCompactionStrategy'LCS

  • 'TimeWindowCompactionStrategy'TWCS

如果需要自定义策略,请将完整类名指定为字符串常量

所有默认策略都支持一些通用选项,以及特定于所选策略的选项。有关详细信息,请参阅与您的策略相对应的部分:STCSLCSTWCS

压缩选项

compression选项定义是否以及如何压缩表的 SSTable。压缩在每个表的基础上配置,作为CREATE TABLEALTER TABLE的可选参数。以下子选项可用

选项 默认 描述

class

LZ4Compressor

要使用的压缩算法。默认压缩器为:LZ4Compressor、SnappyCompressor、DeflateCompressor 和 ZstdCompressor。使用'enabled' : false禁用压缩。自定义压缩器可以通过指定完整类名作为字符串常量来提供。

enabled

true

启用/禁用 sstable 压缩。如果enabled选项设置为false,则不得指定其他选项。

chunk_length_in_kb

64

磁盘上的 SSTable 按块压缩(以允许随机读取)。此选项定义所述块的大小(以 KB 为单位)。有关更多信息,请参阅注释

compression_level

3

压缩级别。仅适用于ZstdCompressor。接受-13107222之间的值。

较大的值可能会提高压缩率,但会增加从磁盘读取数据以进行读取的最小大小。默认值是压缩表的最佳值。计算未压缩文件偏移量的块号时,块长度必须是 2 的幂。可以根据读/写访问模式调整块大小,例如

  • 一次通常请求多少数据

  • 表中行的平均大小

例如,要创建一个使用 LZ4Compressor 和 4 KB 的chunk_length_in_kb的表

CREATE TABLE simple (
   id int,
   key text,
   value text,
   PRIMARY KEY (key, value)
) WITH compression = {'class': 'LZ4Compressor', 'chunk_length_in_kb': 4};
缓存选项

缓存优化了表的缓存内存使用。缓存的数据按大小和访问频率加权。caching选项可以配置表的key cacherow cache。以下子选项可用

选项 默认 描述

keys

ALL

是否为该表缓存键(键缓存)。有效值为:ALLNONE

rows_per_partition

NONE

每个分区缓存的行数(行缓存)。如果指定整数n,则将缓存分区的前n个查询行。有效值为:ALL(缓存查询分区的全部行)或NONE(禁用行缓存)。

例如,要创建一个同时具有键缓存和每个分区缓存 10 行的表

CREATE TABLE simple (
id int,
key text,
value text,
PRIMARY KEY (key, value)
) WITH caching = {'keys': 'ALL', 'rows_per_partition': 10};
读取修复选项

read_repair选项配置读取修复行为,以调整各种性能和一致性行为。

这些值是

选项 默认 描述

BLOCKING

yes

如果触发读取修复,读取将阻止发送到其他副本的写入,直到写入达到一致性级别。

NONE

no

如果设置,协调器将协调副本之间的任何差异,但不会尝试修复它们。

读取修复行为会影响两个一致性属性。

  • 单调仲裁读取:单调仲裁读取可防止读取在某些情况下看起来像回溯时间。当未提供单调仲裁读取并且写入未能到达仲裁副本时,读取值可能在一个读取中可见,然后在后续读取中消失。BLOCKING提供此行为。

  • 写入原子性:写入原子性可防止读取返回部分应用的写入。Cassandra 尝试提供分区级写入原子性,但由于只有 SELECT 语句覆盖的数据会由读取修复修复,因此当以比写入更细粒度的级别读取数据时,读取修复会破坏写入原子性。例如,如果您将多个行写入批处理中的聚类分区,但随后通过在 SELECT 语句中指定聚类列来选择单个行,则读取修复可能会破坏写入原子性。NONE提供此行为。

其他注意事项
  • 添加新列(请参阅下面的ALTER TABLE)是一个恒定时间操作。因此,在最初创建表时,无需预测未来的使用情况。

ALTER TABLE

修改现有表使用ALTER TABLE语句

alter_table_statement::= ALTER TABLE [ IF EXISTS ] table_name alter_table_instruction
alter_table_instruction::= ADD [ IF NOT EXISTS ] column_definition ( ',' column_definition)*
	| DROP [ IF EXISTS ] column_name ( ',' column_name )*
	| RENAME [ IF EXISTS ] column_name to column_name (AND column_name to column_name)*
	| ALTER [ IF EXISTS ] column_name ( column_mask | DROP MASKED )
	| WITH options
column_definition::= column_name cql_type [ column_mask]
column_mask::= MASKED WITH ( DEFAULT | function_name '(' term ( ',' term )* ')' )

如果表不存在,该语句将返回错误,除非使用IF EXISTS,在这种情况下,操作将是无操作。

例如

ALTER TABLE addamsFamily ADD gravesite varchar;
ALTER TABLE addamsFamily
   WITH comment = 'A most excellent and useful table';

ALTER TABLE语句可以

  • ADD一个新列到表中。表的键不能更改。因此,新列不能是主键的一部分。添加列是一个恒定时间操作,基于表中的数据量。如果新列已经存在,该语句将返回错误,除非使用IF NOT EXISTS,在这种情况下,操作将是无操作。

  • DROP从表中删除一列。此命令将删除该列及其所有内容。请注意,虽然该列会立即不可用,但其内容会在压缩期间延迟删除。由于这种延迟删除,该命令是一个恒定时间操作,基于表中的数据量。此外,重要的是要知道,一旦删除一列,就可以重新添加具有相同名称的列,除非删除的列是非冻结列(如集合)。如果删除的列不存在,该语句将返回错误,除非使用IF EXISTS,在这种情况下,操作将是无操作。

警告

删除列假设用于该列值的 timestamps 是以微秒为单位的“真实” timestamps。使用以微秒为单位的“真实” timestamps 是默认设置,并且强烈推荐,但由于 Cassandra 允许客户端在任何表上提供任何 timestamps,因此理论上可以使用其他约定。请注意,如果您这样做,删除列将无法正确执行。

  • RENAME表的键列。不能重命名非键列。此外,不允许将列重命名为已存在的其他名称。重要的是要记住,重命名的列不应该有依赖的二级索引。如果重命名的列不存在,该语句将返回错误,除非使用IF EXISTS,在这种情况下,操作将是无操作。

  • 使用WITH更改表选项。支持的选项与创建表时使用的选项相同,但CLUSTERING ORDER除外。但是,设置任何compaction子选项将擦除所有以前的compaction选项,因此您需要重新指定要保留的所有子选项。compression子选项也是如此。

DROP TABLE

删除表使用DROP TABLE语句

drop_table_statement::= DROP TABLE [ IF EXISTS ] table_name

删除表会导致立即、不可逆地删除该表,包括它包含的所有数据。

如果表不存在,该语句将返回错误,除非使用IF EXISTS,在这种情况下,操作将是无操作。

TRUNCATE TABLE

可以使用TRUNCATE语句截断表

truncate_statement::= TRUNCATE [ TABLE ] table_name

TRUNCATE TABLE foo是与其他 DDL 语句一致的首选语法。但是,表是目前唯一可以截断的对象,并且可以省略TABLE关键字。

截断表会永久删除表中所有现有数据,但不会删除表本身。