数据定义
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 |
---|---|---|---|---|
|
map |
yes |
n/a |
键空间要使用的复制策略及其选项(请参阅以下详细信息)。 |
|
simple |
no |
true |
是否对该键空间使用提交日志进行更新(自行承担风险禁用此选项!)。 |
replication
属性是必需的,必须包含定义所需 复制策略 类的 'class'
子选项。其余子选项取决于使用的复制策略。默认情况下,Cassandra 支持以下 'class'
值
SimpleStrategy
一种简单的策略,它为数据定义一个复制因子,以便将数据分散到整个集群中。这通常不是生产环境中的明智选择,因为它不尊重数据中心布局,会导致查询延迟差异很大。对于生产环境,请使用 NetworkTopologyStrategy
。SimpleStrategy
支持一个必需的参数
sub-option | type | since | description |
---|---|---|---|
|
int |
all |
每个范围要存储的副本数量 |
NetworkTopologyStrategy
一种生产就绪的复制策略,它独立地为每个数据中心设置复制因子。其余子选项是键值对,其中键设置为数据中心名称,其值为关联的复制因子。选项
sub-option | type | description | '<datacenter>' |
---|---|---|---|
int |
在提供的数据中心中每个范围要存储的副本数量。 |
|
int |
在以后更改键空间并更改 replication_factor
时,自动扩展将仅出于安全原因添加新的数据中心,不会更改现有数据中心或删除任何数据中心,即使它们不再位于集群中。如果您想在设置 replication_factor
时删除数据中心,请明确将要设置为零副本的数据中心设置为零。
使用两个数据中心(DC1
和 DC2
)自动扩展数据中心的示例:
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;
如果已启用 瞬时复制,则可以通过以下格式定义复制因子来为 SimpleStrategy
和 NetworkTopologyStrategy
配置瞬时副本:'<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);
尝试创建已存在的表将返回错误,除非使用 IF NOT EXISTS
指令。如果使用此指令,如果表已存在,则该语句将成为无操作。
列定义
CQL 表中的每一行都将具有在表创建时定义的预定义列。可以使用 alter 语句 在以后添加列。
column_definition
由列的名称及其 类型 组成,限制了该列接受的值。此外,列定义可以具有以下修饰符
静态列
在表定义中,某些列可以声明为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 主键由两部分组成
以下是一些主键定义的示例
-
PRIMARY KEY (a)
:a
是单个分区键,没有聚簇列 -
PRIMARY KEY (a, b, c)
:a
是单个分区键,b
和c
是聚簇列 -
PRIMARY KEY ((a, b), c)
:a
和b
组成复合分区键,c
是聚簇列
如上所述,主键唯一标识表中的一行。这种唯一性的结果是,如果使用相同的主键插入另一行,则会发生 |
分区键
在一个表中,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 在同一分区中,因为列 a 和 b 都为零。 |
2 | 行 3 和 4 在同一分区中,但分区不同,因为列 a 为零,列 b 在两行中都为 1。 |
3 | 行 5 独自在一个第三个分区中,因为列 a 和 b 都为 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
子句的方式。结果只能按原始聚簇顺序或反向聚簇顺序排序。假设您创建一个具有两个聚簇列a
和b
的表,定义为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 |
无 |
自由格式的人类可读注释 |
simple |
99PERCENTILE |
推测重试选项 |
|
|
布尔值 |
false |
在表上创建更改数据捕获 (CDC) 日志 |
|
simple |
99PERCENTILE |
与 |
|
simple |
864000 |
在垃圾回收墓碑(删除标记)之前等待的时间 |
|
simple |
0.00075 |
sstable 布隆过滤器的误报概率目标。这些布隆过滤器将被调整大小以提供提供的概率,因此降低此值会影响内存和磁盘中布隆过滤器的尺寸。 |
|
simple |
0 |
表的默认过期时间(“TTL”)以秒为单位 |
|
map |
见下文 |
|
|
map |
见下文 |
|
|
map |
见下文 |
缓存选项 |
|
simple |
0 |
Cassandra 将内存表刷新到磁盘之前的时间(以毫秒为单位) |
|
simple |
BLOCKING |
设置读修复行为(见下文) |
推测重试选项
默认情况下,Cassandra 读取协调器只查询满足一致性级别的必要副本数量:一致性级别为ONE
时查询一个副本,一致性级别为QUORUM
时查询一个副本,依此类推。speculative_retry
决定协调器何时可以查询其他副本,这是一个有用的操作,当副本速度慢或无响应时。推测重试可以减少延迟。speculative_retry
选项配置快速读取保护,其中协调器发送比满足一致性级别所需的请求更多的请求。
频繁地从其他副本读取可能会损害集群性能。如有疑问,请保留默认值 |
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)。例如,将值分配为none
、None
或NONE
具有相同的效果。
此外,还添加了以下值
格式 | 示例 | 描述 |
---|---|---|
|
90.5PERCENTILE |
协调器记录所有副本的平均每表响应时间。如果副本花费的时间超过该表平均响应时间的 |
|
90.5P |
与 |
|
25ms |
如果副本花费的时间超过 |
|
MIN(99PERCENTILE,35MS) |
一种混合策略,根据计算时的较小值使用指定的百分位数或固定毫秒数。参数为 |
|
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
设置指定将廉价的仲裁写入升级为包含瞬态副本的阈值。
压缩选项
compression
选项定义是否以及如何压缩表的 SSTable。压缩在每个表的基础上配置,作为CREATE TABLE
或ALTER TABLE
的可选参数。以下子选项可用
选项 | 默认 | 描述 |
---|---|---|
|
LZ4Compressor |
要使用的压缩算法。默认压缩器为:LZ4Compressor、SnappyCompressor、DeflateCompressor 和 ZstdCompressor。使用 |
|
true |
启用/禁用 sstable 压缩。如果 |
|
64 |
磁盘上的 SSTable 按块压缩(以允许随机读取)。此选项定义所述块的大小(以 KB 为单位)。有关更多信息,请参阅注释。 |
|
3 |
压缩级别。仅适用于 |
较大的值可能会提高压缩率,但会增加从磁盘读取数据以进行读取的最小大小。默认值是压缩表的最佳值。计算未压缩文件偏移量的块号时,块长度必须是 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 cache
和row cache
。以下子选项可用
选项 | 默认 | 描述 |
---|---|---|
|
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
选项配置读取修复行为,以调整各种性能和一致性行为。
这些值是
选项 | 默认 | 描述 |
---|---|---|
|
yes |
如果触发读取修复,读取将阻止发送到其他副本的写入,直到写入达到一致性级别。 |
|
no |
如果设置,协调器将协调副本之间的任何差异,但不会尝试修复它们。 |
读取修复行为会影响两个一致性属性。
-
单调仲裁读取:单调仲裁读取可防止读取在某些情况下看起来像回溯时间。当未提供单调仲裁读取并且写入未能到达仲裁副本时,读取值可能在一个读取中可见,然后在后续读取中消失。
BLOCKING
提供此行为。 -
写入原子性:写入原子性可防止读取返回部分应用的写入。Cassandra 尝试提供分区级写入原子性,但由于只有 SELECT 语句覆盖的数据会由读取修复修复,因此当以比写入更细粒度的级别读取数据时,读取修复会破坏写入原子性。例如,如果您将多个行写入批处理中的聚类分区,但随后通过在 SELECT 语句中指定聚类列来选择单个行,则读取修复可能会破坏写入原子性。
NONE
提供此行为。
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
子选项也是如此。