資料定義
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_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
選項。如果使用此選項,如果鍵空間已存在,則陳述式將為 no-op。
支援的 options
如下
名稱 | 種類 | 強制性 | 預設值 | 說明 |
---|---|---|---|---|
|
映射 |
是 |
不適用 |
要使用的鍵空間複製策略和選項(請參閱以下詳細資料)。 |
|
簡單 |
否 |
true |
是否對此鍵空間的更新使用提交記錄(自行承擔停用此選項的風險!)。 |
replication
屬性為強制性,且必須包含定義所需 複製策略類別的 'class'
子選項。其餘子選項取決於使用的複製策略。預設情況下,Cassandra 支援下列 'class'
值
SimpleStrategy
定義將資料散佈到整個叢集的複製因子的簡單策略。這通常不是製作環境的明智選擇,因為它不尊重資料中心配置,且可能導致查詢延遲大幅度變化。對於製作環境,請使用 NetworkTopologyStrategy
。SimpleStrategy
支援單一強制性引數
子選項 | 類型 | 自 | 說明 |
---|---|---|---|
|
int |
全部 |
每個範圍儲存的複製品數量 |
NetworkTopologyStrategy
為每個資料中心獨立設定複製因子的製作環境複製策略。其餘子選項為鍵值對,其中鍵設定為資料中心名稱,其值設定為關聯的複製因子。選項
子選項 | 類型 | 說明 | '<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;
如果已啟用 暫時性複本,則可以透過定義格式為 '<total_replicas>/<transient_replicas>'
的複本係數,為 SimpleStrategy
和 NetworkTopologyStrategy
設定暫時性複本
例如,這個鍵空間在 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_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 資料表中的每一列都將具有在資料表建立時定義的預定義欄位。稍後可以使用 變更陳述式新增欄位。
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
值相同(static1
)(分割區金鑰為 pk
,且兩列位於同一個分割區):第二次插入會覆寫 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 在同一個分區中,但不同於列 1 和 2,因為在兩列中,欄位 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
群集欄位會定義這些列顯示的順序。資料表的分割鍵會將列分組在同一個節點上,而群集欄位則會控制這些列在節點上的儲存方式。
這種排序允許在分割區中非常有效率地擷取資料範圍
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 ()
在表格架構中宣告群集順序。此最佳化通常用於時間序列,以從最新到最舊擷取資料。
其他表格選項
表格支援下列選項
選項 | 種類 | 預設值 | 說明 |
---|---|---|---|
|
簡單 |
無 |
自由格式、人類可讀的註解 |
簡單 |
99PERCENTILE |
推測重試選項 |
|
|
布林值 |
false |
在表格上建立變更資料擷取 (CDC) 記錄 |
|
簡單 |
99PERCENTILE |
與 |
|
簡單 |
864000 |
垃圾回收墓碑(刪除標記)前要等待的時間 |
|
簡單 |
0.00075 |
sstable 布林過濾器的假陽性目標機率。所述布林過濾器的大小將調整為提供指定的機率,因此降低此值會影響布林過濾器在記憶體和磁碟中的大小。 |
|
簡單 |
0 |
表格的預設過期時間(「TTL」),單位為秒 |
|
映射 |
請參閱下方 |
|
|
映射 |
請參閱下方 |
|
|
映射 |
請參閱下方 |
快取選項 |
|
簡單 |
0 |
Cassandra 將 memtable 清除到磁碟前的時間 (毫秒) |
|
簡單 |
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 |
與 |
|
25 毫秒 |
如果副本花費超過 |
|
MIN(99PERCENTILE,35MS) |
一種混合政策,會根據計算時較低的值來使用指定的百分位數或固定毫秒數。參數為 |
|
MAX(90.5P,25ms) |
一種混合政策,會根據計算時較高的值來使用指定的百分位數或固定毫秒數。 |
Cassandra 4.0 新增對混合 MIN()
和 MAX()
推測重試政策的支援,並混合搭配 MIN(), MAX()
、MIN(), MIN()
或 MAX(), MAX()
(CASSANDRA-14293)。如果資料表的正常 p99
小於最小值 50 毫秒,混合模式仍會推測。但如果 p99
層級高於最大值,則可以使用該值。在混合值中,一個值必須是固定時間 (ms) 值,另一個值必須是百分位數值。
為了說明變異,以下範例皆為有效
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 且 chunk_length_in_kb
為 4 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 快取
和 row 快取
。下列子選項可用
選項 | 預設值 | 說明 |
---|---|---|
|
ALL |
是否要快取此表格的鍵(key 快取)。有效值為: |
|
NONE |
每個分割區要快取的列數(row 快取)。如果指定整數 |
例如,要建立一個同時具有 key 快取和每個分割區快取 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
會提供此行為。 -
寫入原子性:寫入原子性可防止讀取傳回部分套用的寫入。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
,這種情況下操作會是無動作。
警告
刪除欄位假設此欄位的值所使用的時間戳記是微秒中的「實際」時間戳記。使用微秒中的「實際」時間戳記是預設值,且強烈建議使用,但由於 Cassandra 允許用戶在任何表格上提供任何時間戳記,因此理論上可以使用其他慣例。請注意,如果您這麼做,刪除欄位將無法正確執行。 |
-
RENAME
表格的主鍵欄位。無法重新命名非主鍵欄位。此外,不允許將欄位重新命名為已存在的其他名稱。請務必記住,重新命名的欄位不應有相依的次要索引。如果重新命名的欄位不存在,則陳述式會傳回錯誤,除非使用IF EXISTS
,否則操作為無動作。 -
使用
WITH
變更表格選項。 支援的選項 與建立表格時使用的選項相同,但CLUSTERING ORDER
除外。但是,設定任何compaction
子選項會清除所有先前的compaction
選項,因此您需要重新指定您想要保留的所有子選項。compression
子選項也是如此。