Cassandra 查詢語言 (CQL) v3.4.3
\{toc:maxLevel=3}
CQL 語法
前言
本文檔描述 Cassandra 查詢語言 (CQL) 版本 3。CQL v3 與 CQL v2 不向後相容,並且在許多方面與 CQL v2 不同。請注意,本文檔描述語言的最新版本。但是,變更區段提供 CQL v3 不同版本之間的差異。
CQL v3 提供與 SQL 非常接近的模型,因為資料會放入包含列行的表格中。因此,在本文檔中使用時,這些術語(表格、列和行)的定義與它們在 SQL 中的定義相同。但請注意,它們因此不會參考在 Cassandra 的內部實作以及 Thrift 和 CQL v2 API 中找到的列和行概念。
慣例
為協助說明 CQL 語法,我們將在此文件中使用以下慣例
-
語言規則將以類似 BNF 的符號表示
bc(syntax). ::= TERMINAL
-
非終端符號將具有
<尖括號>
。 -
作為 BNF 的其他捷徑符號,我們將使用傳統的正規表示式符號 (
?
、+
和*
) 來表示給定符號為選用和/或可重複。我們還允許使用括號將符號分組,並使用[<字元>]
符號表示<字元>
中的任何一個。 -
語法提供用於文件目的,並省略一些次要的詳細資料。例如,
CREATE TABLE
陳述式中的最後一欄定義為選用,但如果存在則支援,即使文件中提供的語法建議不支援。 -
範例程式碼將提供在程式碼區塊中
bc(sample). SELECT sample_usage FROM cql;
-
在執行文字中對 CQL 程式碼中的關鍵字或部分的參照將顯示在
固定寬度字型
中。
識別碼和關鍵字
CQL 語言使用 識別碼 (或 名稱) 來識別表格、欄和其它物件。識別碼是符合正規表示式
的代碼。[a-zA-Z0-9_]
*
許多此類識別碼,例如 SELECT
或 WITH
,是 關鍵字。它們對語言具有固定的意義,且大多數是保留的。這些關鍵字的清單可以在 附錄 A 中找到。
識別碼和 (未加引號的) 關鍵字不區分大小寫。因此,SELECT
與 select
或 sElEcT
相同,而 myId
與 myid
或 MYID
相同,例如。一個經常使用的慣例 (特別是此文件的範例) 是對關鍵字使用大寫,而對其他識別碼使用小寫。
有一種第二類型的識別碼稱為 加引號識別碼,定義為將任意字元序列置於雙引號 ("
) 中。加引號識別碼從來都不是關鍵字。因此,"select"
不是保留關鍵字,且可用於參照欄,而 select
會產生解析錯誤。此外,與未加引號的識別碼和關鍵字相反,加引號識別碼區分大小寫 ("My Quoted Id"
與 "my quoted id"
不同)。與
相符的完全小寫加引號識別碼等於移除雙引號所取得的未加引號識別碼 (因此 [a-zA-Z0-9_]
*"myid"
等於 myid
和 myId
,但與 "myId"
不同)。在加引號識別碼內,雙引號字元可以重複以跳脫它,因此 "foo "" bar"
是有效的識別碼。
警告:引號識別碼允許宣告具有任意名稱的欄位,而這些名稱有時會與伺服器使用的特定名稱衝突。例如,在使用條件更新時,伺服器會回應包含名為 "[applied]"
的特殊結果的結果集。如果您已宣告具有此名稱的欄位,這可能會混淆某些工具,應避免使用。一般而言,應優先使用未加引號的識別碼,但如果您使用引號識別碼,強烈建議避免使用方括號括住的任何名稱(例如 "[applied]"
)和任何看起來像函式呼叫的名稱(例如 "f(x)"
)。
常數
CQL 定義下列類型的常數:字串、整數、浮點數、布林值、UUID 和二進位大型物件
-
字串常數是任意字元序列,並以單引號(
'
)括住。您可以在字串中包含單引號,方法是重複它,例如'It''s raining today'
。這些不能與使用雙引號的引號識別碼混淆。 -
整數常數定義為
'-'?[0-9]+
。 -
浮點數常數定義為
'-'?[0-9]+('.'[0-9]*)?([eE][+-]?[0-9+])?
。除此之外,NaN
和Infinity
也是浮點數常數。 -
布林值常數為
true
或false
,不分大小寫(即True
是有效的布林值常數)。 -
UUID 常數定義為
hex{8}-hex{4}-hex{4}-hex{4}-hex{12}
,其中hex
是十六進位字元,例如[0-9a-fA-F]
,而{4}
是此類字元的數量。 -
二進位大型物件常數是十六進位數字,定義為
0[xX](hex)+
,其中hex
是十六進位字元,例如[0-9a-fA-F]
。
有關如何輸入這些常數的類型,請參閱 資料類型區段。
術語
CQL 有術語的概念,表示 CQL 支援的值類型。術語定義為
term::= constant | literal | function_call | arithmetic_operation | type_hint | bind_marker
literal::= collection_literal | vector_literal | udt_literal | tuple_literal
function_call::= identifier '(' [ term (',' term)* ] ')'
arithmetic_operation::= '-' term | term ('+' | '-' | '*' | '/' | '%') term
type_hint::= '(' cql_type ')' term
bind_marker::= '?' | ':' identifier
因此,術語之一為
註解
CQL 中的註解是開頭為雙破折號 (--
) 或雙斜線 (//
) 的一行。
多行註解也受到支援,透過包含在 /
和 /
中 (但不支援巢狀)。
bc(sample).
— 這是註解
/* 這是
多行註解 */
陳述式
CQL 包含陳述式。與 SQL 一樣,這些陳述式可以分為 3 類
-
資料定義陳述式,允許設定和變更資料儲存的方式。
-
資料操作陳述式,允許變更資料
-
查詢,用於查詢資料
所有陳述式都以分號 (;
) 結尾,但處理單一陳述式時可以省略分號。支援的陳述式在以下區段中說明。在說明這些陳述式的語法時,我們將重複使用下列定義的非終端符號
bc(syntax)..
::= 任何帶引號或不帶引號的識別碼,不包括保留關鍵字
::= ( `.')?
::= 字串常數
::= 整數常數
::= 浮點常數
::= |
::= uuid 常數
::= 布林常數
::= blob 常數
::=
|
|
|
|
::= ?'
,' )*)? `)'
| `:'
::=
|
|
| `(' ( (
::=
|
|
::= `\{' ( `:' ( `,' `:' )* )? `}'
::= `\{' ( ( `,' )* )? `}'
::= `[' ( ( `,' )* )? `]'
::=
::= (AND )*
::= =' ( | | )
p.
請注意,上述語法的並非所有可能的產生式在實務上都是有效的。最值得注意的是,目前不允許在 <collection-literal>
內使用 <variable>
和巢狀 <collection-literal>
。
<variable>
可以是匿名的 (一個問號 (?
)) 或命名的 (一個識別碼,前面加上 :
)。兩者都宣告 準備好的陳述式 的繫結變數。匿名變數和命名變數之間唯一的差別是,命名變數更容易參考 (確切的方式取決於使用的客戶端驅動程式)。
<properties>
產生式用於建立和變更鍵空間和資料表的陳述式。每個 <property>
都是一個簡單的,這種情況下只有一個值,或一個對應的,這種情況下它的值是一個對應子選項的分組對應。以下將其中一個或另一個稱為屬性的種類(簡單或對應)。
<tablename>
將用於識別資料表。這是一個表示資料表名稱的識別碼,可以加上鍵空間名稱。如果提供了鍵空間名稱,允許在與目前活動鍵空間不同的另一個鍵空間中識別資料表(目前活動鍵空間是透過 USE
陳述式設定的)。
對於支援的 <function>
,請參閱 函式 部分。
字串可以用單引號或兩個美元字元括起來。第二個語法已引入允許包含單引號的字串。此類字串的典型候選字串是使用者定義函式的原始碼片段。
範例
bc(sample)..
`some string value'
雙美元字串可以包含單引號
p.
已準備好的陳述式
CQL 支援已準備好的陳述式。已準備好的陳述式是一種最佳化,允許只分析一次查詢,但使用不同的具體值執行多次。
在陳述式中,每次預期欄位值(在資料處理和查詢陳述式中),可以使用 <variable>
(請參閱上方)代替。然後必須準備具有繫結變數的陳述式。準備好後,可以透過提供繫結變數的具體值來執行。準備陳述式和執行已準備好陳述式的確切程序取決於所使用的 CQL 驅動程式,不在本文檔的範圍內。
除了提供欄位值外,繫結標記可用於提供 LIMIT
、TIMESTAMP
和 TTL
子句的值。如果使用匿名繫結標記,則查詢參數的名稱分別為 [limit]
、[timestamp]
和 [ttl]
。
資料定義
建立鍵空間
語法
bc(syntax)..
::= CREATE KEYSPACE (IF NOT EXISTS)? WITH
p.
範例
bc(sample)..
CREATE KEYSPACE Excelsior
WITH replication = \{’class’: `SimpleStrategy', `replication_factor' : 3};
CREATE KEYSPACE Excalibur
使用複製 = \{’類別’: NetworkTopologyStrategy', `DC1' : 1, `DC2' : 3}
且 durable_writes = false;
p.
`CREATE KEYSPACE` 陳述式會建立新的頂層鍵空間。鍵空間是定義一組資料表的複製策略和一些選項的名稱空間。有效的鍵空間名稱是純由字母數字字元組成的識別碼,且長度小於或等於 32。請注意,作為識別碼,鍵空間名稱不區分大小寫:對於大小寫敏感的鍵空間名稱,請使用引號識別碼。
CREATE KEYSPACE
支援的 <屬性>
為
名稱 | 種類 | 強制 | 預設值 | 說明 |
---|---|---|---|---|
|
對應 |
是 |
要使用的鍵空間複製策略和選項。 |
|
|
簡單 |
否 |
true |
是否要針對此鍵空間的更新使用提交記錄 (自行承擔風險停用此選項!)。 |
replication
<屬性>
為強制。它至少必須包含定義要使用的複製策略類別的 '類別'
子選項。其餘子選項取決於該複製策略類別。預設情況下,Cassandra 支援下列 '類別'
-
'SimpleStrategy'
:定義整個叢集的簡單複製因子的簡單策略。支援的唯一子選項為'replication_factor'
,用於定義該複製因子,且為強制選項。 -
'NetworkTopologyStrategy'
:允許為每個資料中心獨立設定複製因子的複製策略。其餘子選項為鍵值對,其中每次的鍵為資料中心名稱,而值為該資料中心的複製因子。
嘗試建立已存在的鍵空間會傳回錯誤,除非使用了 IF NOT EXISTS
選項。如果使用了,如果鍵空間已存在,則陳述式將不會執行任何操作。
使用
語法
bc(語法)。::= 使用
範例
bc(範例)。使用 myApp;
USE
陳述式採用現有的鍵空間名稱作為引數,並將其設定為每個連線目前的作業鍵空間。除非 另行指定,否則所有後續的鍵空間特定動作都將在所選鍵空間的內容中執行,直到發出另一個 USE 陳述式或連線終止。
變更鍵空間
語法
bc(syntax)..
::= 變更鍵空間 (IF EXISTS)? WITH
p.
範例
bc(sample)..
變更鍵空間 Excelsior
WITH replication = \{’class’: `SimpleStrategy', `replication_factor' : 4};
ALTER KEYSPACE
聲明會變更現有鍵空間的屬性。支援的 <properties>
與 CREATE KEYSPACE
聲明相同。
DROP KEYSPACE
語法
bc(syntax). ::= DROP KEYSPACE ( IF EXISTS )?
範例
bc(sample). DROP KEYSPACE myApp;
DROP KEYSPACE
聲明會立即且不可逆地移除現有鍵空間,包括其中的所有資料行家族,以及這些資料行家族中包含的所有資料。
如果鍵空間不存在,聲明會傳回錯誤,除非使用 IF EXISTS
,這種情況下操作會是 no-op。
CREATE TABLE
語法
bc(syntax)..
::= CREATE ( TABLE | COLUMNFAMILY ) ( IF NOT EXISTS )?
`(' ( `,' )* `)'
( WITH ( AND )* )?
::= ( STATIC )? ( PRIMARY KEY )?
| PRIMARY KEY `(' ( `,' )* `)'
::=
| (' (
,' )* `)'
::=
| COMPACT STORAGE
| CLUSTERING ORDER
p.
範例
bc(sample)..
CREATE TABLE monkeySpecies (
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' };
聲明會建立新表格。每個此類表格都是一組列 (通常代表相關實體),它會為這些列定義多項屬性。表格由 名稱 定義,它會定義組成表格列的欄位,並有多項 選項。請注意,
p.
`CREATE TABLECREATE COLUMNFAMILY
語法支援作為 CREATE TABLE
的別名 (出於歷史原因)。
嘗試建立已存在的表格會傳回錯誤,除非使用 IF NOT EXISTS
選項。如果使用,如果表格已存在,聲明會是 no-op。
<tablename>
有效的表格名稱與有效的 鍵空間名稱 相同 (長度最多 32 個字元的字母數字識別碼)。如果僅提供表格名稱,表格會在目前鍵空間中建立 (請參閱 USE
),但如果它是由現有鍵空間名稱為前綴 (請參閱 <tablename>
語法),它會在指定的鍵空間中建立 (但不會變更目前鍵空間)。
<column-definition>
CREATE TABLE
陳述定義表格列可以擁有的列。欄位由其名稱(識別碼)和類型定義(有關允許類型及其屬性的更多詳細資料,請參閱 資料類型 區段)。
在表格中,列會由其 PRIMARY KEY
(或更簡單地說,就是金鑰)唯一識別,因此所有表格定義必須定義 PRIMARY KEY(且只有一個)。PRIMARY KEY
由表格中定義的一個或多個欄位組成。如果 PRIMARY KEY
僅有一個欄位,則可以在欄位定義後直接指定。否則,必須在 PRIMARY KEY
後面加上括號中由逗號分隔的組成金鑰的欄位名稱清單來指定。請注意
bc(sample).
CREATE TABLE t (
k int PRIMARY KEY,
other text
)
等於
bc(sample).
CREATE TABLE t (
k int,
other text,
PRIMARY KEY (k)
)
分區金鑰和叢集欄位
在 CQL 中,為 PRIMARY KEY
定義欄位的順序很重要。金鑰的第一個欄位稱為分區金鑰。它具有以下屬性:所有共用相同分區金鑰的列(事實上甚至跨表格)都儲存在同一個實體節點上。此外,針對共用特定表格的相同分區金鑰的列進行的插入/更新/刪除會以原子和隔離方式執行。請注意,可以擁有複合分區金鑰,也就是使用一組額外的括號來定義哪些欄位組成分區金鑰,以形成由多個欄位組成的分區金鑰。
PRIMARY KEY
定義的其餘欄位(如果有)稱為__叢集欄位。在特定實體節點上,特定分區金鑰的列會按照叢集欄位產生的順序儲存,讓以該叢集順序擷取列特別有效率(請參閱 SELECT
)。
STATIC
欄位
在表格定義中,有些欄位可以宣告為 STATIC
。靜態欄位將會由屬於相同分區(擁有相同分區金鑰)的所有列``共用''。例如,在
bc(sample).
CREATE TABLE test (
pk int,
t int,
v text,
s text static,
PRIMARY KEY (pk, t)
);
INSERT INTO test(pk, t, v, s) VALUES (0, 0, `val0', `static0');
INSERT INTO test(pk, t, v, s) VALUES (0, 1, `val1', `static1');
SELECT * FROM test WHERE pk=0 AND t=0;
最後的查詢會傳回 `'static1'` 作為 `s` 的值,因為 `s` 是靜態的,因此第二次插入修改了這個 `'shared'` 值。不過請注意,靜態欄位只在給定的分割區內是靜態的,如果在上面的範例中兩列來自不同的分割區(也就是說,如果它們有不同的 `pk` 值),第二次插入就不會修改第一列的 `s` 值。
允許靜態欄位時會套用一些限制
-
有 `COMPACT STORAGE` 選項(見下方)的表格不能有靜態欄位
-
沒有叢集欄位的表格不能有靜態欄位(在沒有叢集欄位的表格中,每個分割區只有一個列,因此每個欄位本質上都是靜態的)。
-
只有非 `PRIMARY KEY` 欄位可以是靜態的
<option>
CREATE TABLE
陳述式支援許多選項,用於控制新表格的組態。這些選項可以在 WITH
關鍵字之後指定。
這些選項的第一個是 COMPACT STORAGE
。此選項主要針對在 CQL3 之前建立的定義的向後相容性(有關更多詳細資料,請參閱 www.datastax.com/dev/blog/thrift-to-cql3)。此選項也提供稍微更精簡的資料磁碟配置,但代價是降低表格的彈性和可擴充性。最值得注意的是,COMPACT STORAGE
表格不能有集合或靜態欄位,而且有至少一個叢集欄位的 COMPACT STORAGE
表格支援的欄位正好是一個(表示不是 0 或大於 1)不屬於 PRIMARY KEY
定義的欄位(特別表示您不能在建立後新增或移除欄位)。由於這些原因,除了上述的向後相容性原因之外,不建議使用 COMPACT STORAGE
。
另一個選項是 CLUSTERING ORDER
。它允許定義磁碟上列的順序。它會取得叢集欄位名稱的清單,以及每個欄位的磁碟順序(遞增或遞減)。請注意,此選項會影響 在 SELECT
期間允許哪些 ORDER BY
。
表格建立支援以下其他 <property>
選項 | 種類 | 預設值 | 說明 |
---|---|---|---|
|
簡單 |
無 |
自由格式、人類可讀的註解。 |
|
簡單 |
864000 |
在回收垃圾收集墓碑(刪除標記)之前等待的時間。 |
|
簡單 |
0.00075 |
sstable 布隆過濾器的假陽性目標機率。所述布隆過濾器的大小將調整為提供所提供的機率(因此降低此值會影響布隆過濾器在記憶體和磁碟中的大小) |
|
簡單 |
0 |
表格的預設過期時間(``TTL''),單位為秒。 |
|
對應 |
請參閱下方 |
壓縮選項,請參閱下方。 |
|
對應 |
請參閱下方 |
壓縮選項,請參閱下方。 |
|
對應 |
請參閱下方 |
快取選項,請參閱下方。 |
|
簡單 |
1.0 |
此選項定義在讀取期間應檢查雜湊總和的機率,以偵測位元腐敗並防止毀損傳播到其他複本。預設值為 1,表示每次讀取資料區塊時都會套用雜湊總和。設定為 0 以停用雜湊總和檢查,例如設定為 0.5 以檢查每次讀取。 由於技術限制,我們目前僅將其套用於壓縮檔案。如果表格未啟用壓縮,則不會驗證任何雜湊總和。 |
壓縮選項
compaction
屬性至少必須定義 'class'
子選項,該子選項定義要使用的壓縮策略類別。預設支援的類別為 'SizeTieredCompactionStrategy'
、'LeveledCompactionStrategy'
和 'TimeWindowCompactionStrategy'
。可以透過指定完整類別名稱作為字串常數來提供自訂策略。其餘子選項取決於所選的類別。預設類別支援的子選項為
選項 | 支援的壓縮策略 | 預設值 | 說明 |
---|---|---|---|
|
全部 |
true |
布林值,表示是否應啟用壓縮。 |
|
全部 |
0.2 |
一個比率,如果 sstable 的可垃圾回收墓碑比率超過所有包含欄位的此比率,則 sstable 將被壓縮(沒有其他 sstable),以清除這些墓碑。 |
|
全部 |
1 天 |
在考慮 sstable 建立時間後,在考慮 |
|
全部 |
false |
將此設定為 true 會啟用更積極的墓碑壓縮 - 單一 sstable 墓碑壓縮將在不檢查其成功機率的情況下執行。 |
|
SizeTieredCompactionStrategy |
50MB |
大小分層策略將 SSTable 分組到儲存區中進行壓縮。儲存區會將大小差異小於 50% 的 SSTable 分組。不過,對於較小的尺寸,這會導致分組過於細緻。 |
|
SizeTieredCompactionStrategy |
4 |
啟動次要壓縮所需的最小 SSTable 數量。 |
|
SizeTieredCompactionStrategy |
32 |
由一次次要壓縮處理的最大 SSTable 數量。 |
|
SizeTieredCompactionStrategy |
0.5 |
如果大小在 [average_size * |
|
SizeTieredCompactionStrategy |
1.5 |
如果大小在 [average_size * |
|
LeveledCompactionStrategy |
5MB |
分層策略中 sstable 的目標大小(以 MB 為單位)。請注意,雖然 sstable 大小應保持小於或等於 |
|
TimeWindowCompactionStrategy |
MICROSECONDS |
插入資料時使用的時間戳解析度,可以是 MILLISECONDS、MICROSECONDS 等(Java TimeUnit 應可理解) - 除非您使用 USING TIMESTAMP(或直接在客戶端中使用等效的指令)進行突變,否則請勿變更此設定 |
|
TimeWindowCompactionStrategy |
DAYS |
與 |
|
TimeWindowCompactionStrategy |
1 |
組成時間視窗的 |
|
TimeWindowCompactionStrategy |
false |
過期的 sstable 將會被刪除,而不會檢查其資料是否會遮蔽其他 sstable。這是一個潛在的風險選項,可能會導致資料遺失或已刪除的資料重新出現,超越 |
壓縮選項
對於 compression
屬性,有以下子選項可用
選項 | 預設值 | 說明 | |||
---|---|---|---|---|---|
|
LZ4Compressor |
要使用的壓縮演算法。預設壓縮器為:LZ4Compressor、SnappyCompressor 和 DeflateCompressor。使用 |
|||
|
true |
預設情況下會啟用壓縮。若要停用,請將 |
|
64KB |
磁碟上的 SSTables 會依區塊壓縮(允許隨機讀取)。這會定義所述區塊的大小(以 KB 為單位)。較大的值可能會改善壓縮率,但會增加從磁碟讀取資料的最小大小,以進行讀取 |
ALTER TABLE
語法
bc(syntax)..
::= ALTER (TABLE | COLUMNFAMILY) (IF EXISTS)?
::= ADD (IF NOT EXISTS)?
| ADD (IF NOT EXISTS)? ( ( , )* )
| DROP (IF EXISTS)?
| DROP (IF EXISTS)? ( ( , )* )
| RENAME (IF EXISTS)? TO (AND TO)*
| WITH ( AND )*
p.
範例
bc(sample)..
ALTER TABLE addamsFamily
ALTER TABLE addamsFamily
ADD gravesite varchar;
ALTER TABLE addamsFamily
WITH comment = 最優秀且有用的欄位家族';
p.
`ALTER` 陳述式用於控制資料表定義。它允許新增新欄位、刪除現有欄位或更新資料表選項。與資料表建立一樣,`ALTER COLUMNFAMILY` 被允許作為 `ALTER TABLE` 的別名。如果資料表不存在,則陳述式會傳回錯誤,除非使用 `IF EXISTS`,這種情況下作業為空操作。
<tablename>
是資料表名稱,其前面可以選擇加上鍵空間名稱。<instruction>
定義要執行的變更
-
ADD
:將新欄位新增到資料表中。新欄位的<identifier>
不能與現有欄位衝突。此外,無法將欄位新增到使用COMPACT STORAGE
選項定義的資料表中。如果新欄位已存在,則陳述式會傳回錯誤,除非使用 `IF NOT EXISTS`,這種情況下作業為空操作。 -
DROP
:從資料表中移除欄位。已刪除的欄位會立即在查詢中不可用,且未來不會包含在壓縮的 sstables 中。如果重新新增欄位,則查詢不會傳回在欄位最後一次刪除之前寫入的值。假設時間戳記代表實際時間,因此如果您的情況並非如此,則不應讀取先前已刪除的欄位。無法從使用COMPACT STORAGE
選項定義的資料表中刪除欄位。如果已刪除的欄位不存在,則陳述式會傳回錯誤,除非使用 `IF EXISTS`,這種情況下作業為空操作。 -
RENAME
表格的主要金鑰欄位。非主要金鑰欄位無法重新命名。此外,不允許將欄位重新命名為已存在的其他名稱。請務必記住,重新命名的欄位不應有依賴的次要索引。如果重新命名的欄位不存在,則陳述會傳回錯誤,除非使用IF EXISTS
,否則操作為無操作。 -
WITH
:允許更新表格的選項。支援的<選項>
(和語法)與CREATE TABLE
陳述相同,但COMPACT STORAGE
不受支援。請注意,設定任何compaction
子選項會清除所有先前的compaction
選項,因此如果您要保留這些選項,則需要重新指定所有子選項。相同的注意事項也適用於compression
子選項組。
CQL 類型相容性
CQL 資料類型只能轉換為下表所示的類型。
資料類型可變更為 | 資料類型 |
---|---|
timestamp |
bigint |
ascii、bigint、boolean、date、decimal、double、float、inet、int、smallint、text、time、timestamp、timeuuid、tinyint、uuid、varchar、varint |
blob |
int |
date |
ascii、varchar |
text |
bigint |
time |
bigint |
timestamp |
timeuuid |
uuid |
ascii、text |
varchar |
bigint、int、timestamp |
varint |
叢集欄位有更嚴格的要求,僅允許以下轉換。
資料類型可變更為 | 資料類型 |
---|---|
ascii、text、varchar |
blob |
ascii、varchar |
text |
ascii、text |
varchar |
DROP TABLE
語法
bc(語法)。::= DROP TABLE ( IF EXISTS )?
範例
bc(範例)。DROP TABLE worldSeriesAttendees;
DROP TABLE
陳述會立即且不可逆地移除表格,包括其中包含的所有資料。至於表格建立,DROP COLUMNFAMILY
可作為 DROP TABLE
的別名。
如果表格不存在,則陳述會傳回錯誤,除非使用 IF EXISTS
,否則操作為無操作。
TRUNCATE
語法
bc(語法)。::= TRUNCATE ( TABLE | COLUMNFAMILY )?
範例
bc(範例)。TRUNCATE superImportantData;
TRUNCATE
陳述會永久移除表格中的所有資料。
建立索引
建立索引
陳述式用於在給定資料表中建立給定(現有)欄位的新的次要索引。如果需要,可以在 ON
關鍵字之前指定索引本身的名稱。
語法
bc(syntax)..
::= 建立(自訂)?索引(如果不存在)?()?
在 `(' `)'
(使用(選項 = )?)?
::=
| 鍵( )
p.
範例
bc(sample).
在 NerdMovies(使用者)上建立使用者索引;
在 Mutants(能力 ID)上建立索引;
在使用者(鍵(最愛)上建立索引;
在使用者(年齡)上建立使用 'sai' 的索引;
在使用者(電子郵件)上建立自訂索引,使用 `path.to.the.IndexClass';
在使用者(電子郵件)上建立自訂索引,使用 `path.to.the.IndexClass' 選項 = \{’儲存體’:`/mnt/ssd/indexes/'};
如果欄位中已存在資料,將非同步地建立索引。建立索引後,欄位的新的資料會在插入時自動建立索引。嘗試建立已存在的索引將傳回錯誤,除非使用 如果不存在
選項。如果使用,如果索引已存在,陳述式將為無作用。
索引類型
使用
關鍵字可選擇指定索引類型。有兩種內建類型
-
legacy_local_table -(預設)舊式次要索引,實作為隱藏的本機資料表
-
sai - 「儲存體附加」索引,透過最佳化的 SSTable/Memtable 附加索引實作
若要建立自訂索引,必須指定完全限定的類別名稱。
在 Map 鍵上建立索引
在 map 欄位 上建立索引時,您可以建立鍵或值的索引。如果欄位識別碼置於 keys()
函式中,索引將在 map 鍵上,讓您可以在 WHERE
子句中使用 CONTAINS KEY
。否則,索引將在 map 值上。
刪除索引
語法
bc(語法)。::= 刪除索引(如果存在)?( `.' )?
範例
bc(sample)..
刪除使用者索引;
刪除使用者鍵空間。地址索引;
p.
刪除索引
陳述式用於刪除現有的次要索引。陳述式的引數是索引名稱,可以選擇指定索引的鍵空間。
如果索引不存在,陳述式將傳回錯誤,除非使用 如果存在
,在這種情況下,操作為無作用。
建立實體化檢視
語法
bc(syntax)..
::= 建立物化檢視 (如果不存在)?
選取 ( `(' ( `,' ) * `)' | `' )
從
(哪裡)?
主鍵 `(' ( `,' ) `)'
( WITH ( AND )* )?
p.
範例
bc(sample)..
建立物化檢視 monkeySpecies_by_population
選取 *
從 monkeySpecies
哪裡族群不為 NULL 且物種不為 NULL
主鍵 (族群, 物種)
附註=允許依族群而非物種查詢';
p.
`建立物化檢視` 陳述式建立新的物化檢視。每個此類檢視都是一組列,對應於 `選取` 陳述式中指定的基礎資料表中的列。無法直接更新物化檢視,但更新基礎資料表將導致檢視中對應的更新。
嘗試建立已存在的物化檢視將傳回錯誤,除非使用 `如果不存在` 選項。如果使用,如果物化檢視已存在,陳述式將為空操作。
WHERE
子句
<where-clause>
類似於 選取
陳述式的 where 子句,有一些差異。首先,where 子句必須包含一個表示式,禁止檢視主鍵中的欄位為 NULL
值。如果不需要其他限制,可以使用 不為 NULL
表示式來完成。其次,只有基礎資料表主鍵中的欄位可以使用 不為 NULL
以外的表示式來限制。(請注意,這個第二個限制可能會在未來解除。)
刪除物化檢視
語法
bc(語法)。::= 刪除物化檢視 (如果存在)?
範例
bc(範例)。刪除物化檢視 monkeySpecies_by_population;
刪除物化檢視
陳述式用於刪除現有的物化檢視。
如果物化檢視不存在,陳述式將傳回錯誤,除非使用 如果存在
,這種情況下操作為空操作。
建立類型
語法
bc(syntax)..
::= 建立類型 (如果不存在)?
`(' ( `,' )* `)'
::= ( `.' )?
::=
範例
bc(sample)..
建立類型 address (
street_name 文字,
street_number 整數,
city 文字,
state 文字,
zip 整數
)
建立類型 work_and_home_addresses (
home_address 地址,
work_address 地址
)
p.
建立類型
陳述式建立新的使用者定義類型。每個類型都是一組已命名、已輸入的欄位。欄位類型可以是任何有效的類型,包括集合和其他現有的使用者定義類型。
嘗試建立已存在的類型將導致錯誤,除非使用 如果不存在
選項。如果使用,如果類型已存在,陳述式將為無操作。
<類型名稱>
有效的類型名稱是識別碼。現有 CQL 類型和 保留類型名稱 的名稱不可使用。
如果僅提供類型名稱,則使用目前的鍵空間建立類型(請參閱 使用
)。如果由現有鍵空間名稱為前綴,則類型在指定的鍵空間中建立,而不是目前的鍵空間。
變更類型
語法
bc(syntax)..
::= 變更類型 (如果存在)?
::= ADD (IF NOT EXISTS)?
| 重新命名 (如果存在)?為 (且為)*
p.
範例
bc(sample)..
變更類型地址新增國家/地區文字
變更類型地址將 zip 重新命名為 zipcode,並將 street_name 重新命名為 street
p.
變更類型
陳述式用於操作類型定義。它允許新增新的欄位、重新命名現有欄位或變更現有欄位的類型。如果類型不存在,陳述式將傳回錯誤,除非使用 如果存在
,這種情況下操作為無操作。
刪除類型
語法
bc(syntax)..
::= 刪除類型 (如果存在)?
p.
刪除類型
陳述式導致類型立即且不可逆地移除。嘗試刪除仍由其他類型或表格使用的類型將導致錯誤。
如果類型不存在,將傳回錯誤,除非使用 如果存在
,這種情況下操作為無操作。
建立觸發器
語法
bc(syntax)..
::= 建立觸發器 (如果不存在)? ( )?
在
使用
範例
bc(sample).
在 myTable 上建立觸發器 myTrigger,使用 `org.apache.cassandra.triggers.InvertedIndex';
組成觸發器的實際邏輯可以用任何 Java (JVM) 語言撰寫,且存在於資料庫外部。您將觸發器程式碼置於 Cassandra 安裝目錄的 lib/triggers
子目錄中,它會在叢集啟動期間載入,並存在於參與叢集的每個節點上。定義在資料表上的觸發器會在請求的 DML 陳述式發生前觸發,這可確保交易的原子性。
DROP TRIGGER
語法
bc(syntax)..
::= DROP TRIGGER ( IF EXISTS )? ( )?
在
p.
範例
bc(sample).
DROP TRIGGER myTrigger ON myTable;
DROP TRIGGER
陳述式會移除使用 CREATE TRIGGER
建立的觸發器註冊。
CREATE FUNCTION
語法
bc(syntax)..
::= CREATE ( OR REPLACE )?
FUNCTION ( IF NOT EXISTS )?
( `.' )?
`(' ( `,' )* `)'
( CALLED | RETURNS NULL ) ON NULL INPUT
RETURNS
LANGUAGE
AS
範例
bc(sample).
CREATE OR REPLACE FUNCTION somefunction
( somearg int, anotherarg text, complexarg frozen, listarg list )
RETURNS NULL ON NULL INPUT
RETURNS text
LANGUAGE java
AS + ;
CREATE FUNCTION akeyspace.fname IF NOT EXISTS
( someArg int )
CALLED ON NULL INPUT
RETURNS text
LANGUAGE java
AS + ;
CREATE FUNCTION
會建立或取代使用者定義的函數。
函數簽章
簽章用於區分個別函數。簽章包含
-
完全限定的函數名稱 - 即 keyspace 加上 function-name
-
所有引數類型的串接清單
請注意,keyspace 名稱、函數名稱和引數類型會受到預設命名慣例和大寫/小寫敏感規則的約束。
具有選用 OR REPLACE
關鍵字的 CREATE FUNCTION
會建立函數或以具有相同簽章的現有函數取代它。如果已存在具有相同簽章的函數,則沒有 OR REPLACE
的 CREATE FUNCTION
會失敗。
必須為每個函數定義使用 null
值呼叫時的行為。有兩個選項
-
RETURNS NULL ON NULL INPUT
宣告如果任何輸入引數為null
,函數將永遠傳回null
。 -
CALLED ON NULL INPUT
宣告函數將永遠執行。
如果使用了選用的 IF NOT EXISTS
關鍵字,則只有在具有相同簽章的其他函數不存在時,函數才會建立。
OR REPLACE
和 IF NOT EXIST
無法同時使用。
函數屬於鍵空間。如果未在 <function-name>
中指定鍵空間,則使用目前的鍵空間(即使用 USE
陳述式指定的鍵空間)。無法在其中一個系統鍵空間中建立使用者定義函數。
請參閱 使用者定義函數 部分以取得更多資訊。
DROP FUNCTION
語法
bc(syntax)..
::= DROP FUNCTION ( IF EXISTS )?
( `.' )?
( `(' ( `,' )* `)' )?
範例
bc(sample).
DROP FUNCTION myfunction;
DROP FUNCTION mykeyspace.afunction;
DROP FUNCTION afunction ( int );
DROP FUNCTION afunction ( text );
DROP FUNCTION
陳述式移除使用 CREATE FUNCTION
建立的函數。
如果有多個具有相同名稱但簽章不同的函數(重載函數),則必須指定要移除函數的引數類型(簽章 )。
包含選用 IF EXISTS
關鍵字的 DROP FUNCTION
會在函數存在時移除函數。
CREATE AGGREGATE
語法
bc(syntax)..
::= CREATE ( OR REPLACE )?
AGGREGATE ( IF NOT EXISTS )?
( `.' )?
`(' ( `,' )* `)'
SFUNC
STYPE
( FINALFUNC )?
( INITCOND )?
p.
範例
bc(sample).
CREATE AGGREGATE myaggregate ( val text )
SFUNC myaggregate_state
STYPE text
FINALFUNC myaggregate_final
INITCOND `foo';
請參閱 使用者定義聚合 部分以取得完整範例。
CREATE AGGREGATE
建立或取代使用者定義聚合。
包含選用 OR REPLACE
關鍵字的 CREATE AGGREGATE
會建立聚合或取代具有相同簽章的現有聚合。如果已存在具有相同簽章的聚合,則不含 OR REPLACE
的 CREATE AGGREGATE
會失敗。
包含選用 IF NOT EXISTS
關鍵字的 CREATE AGGREGATE
會在聚合不存在時建立聚合。
OR REPLACE
和 IF NOT EXIST
無法同時使用。
聚合屬於鍵空間。如果未在 <aggregate-name>
中指定鍵空間,則使用目前的鍵空間(即使用 USE
陳述式指定的鍵空間)。無法在其中一個系統鍵空間中建立使用者定義聚合。
使用者定義聚合的簽章遵循與使用者定義函數 相同的規則。
STYPE
定義狀態值的類型,且必須指定。
選用的 INITCOND
定義聚合的初始狀態值。預設為 null
。對於宣告為 RETURNS NULL ON NULL INPUT
的狀態函數,必須指定非 null
的 INITCOND
。
SFUNC
參照現有函數,用作修改狀態的函數。狀態函數的第一個參數類型必須與 STYPE
相符。狀態函數的其餘參數類型必須與聚合函數的參數類型相符。對於宣告為 RETURNS NULL ON NULL INPUT
並呼叫 null
的狀態函數,不會更新狀態。
選用的 FINALFUNC
會在傳回聚合結果之前呼叫。它必須只接受一個類型為 STYPE
的參數。FINALFUNC
的傳回類型可能是不同的類型。宣告為 RETURNS NULL ON NULL INPUT
的最後函數表示,如果最後一個狀態為 null
,則聚合的傳回值會是 null
。
如果未定義 FINALFUNC
,則聚合函數的整體傳回類型為 STYPE
。如果已定義 FINALFUNC
,則它是該函數的傳回類型。
請參閱 使用者定義聚合 部分,以取得更多資訊。
DROP AGGREGATE
語法
bc(syntax)..
::= DROP AGGREGATE ( IF EXISTS )?
( `.' )?
( `(' ( `,' )* `)' )?
p.
範例
bc(sample).
DROP AGGREGATE myAggregate;
DROP AGGREGATE myKeyspace.anAggregate;
DROP AGGREGATE someAggregate ( int );
DROP AGGREGATE someAggregate ( text );
DROP AGGREGATE
陳述式會移除使用 CREATE AGGREGATE
建立的聚合。如果有多個具有相同名稱但簽章不同的聚合(重載聚合),則必須指定要刪除的聚合的參數類型。
具有選用 IF EXISTS
關鍵字的 DROP AGGREGATE
會在聚合存在時刪除聚合,如果具有該簽章的函數不存在,則不執行任何動作。
使用者定義聚合的簽章遵循與使用者定義函數 相同的規則。
資料處理
INSERT
語法
bc(syntax)..
::= INSERT INTO
( ( VALUES )
| ( JSON ))
( IF NOT EXISTS )?
( USING ( AND )* )?
::= `(' ( `,' )* `)'
::= `(' ( `,' )* `)'
::= TIMESTAMP
| TTL
p.
範例
bc(sample)..
INSERT INTO NerdMovies (movie, director, main_actor, year)
VALUES (`Serenity', `Joss Whedon', `Nathan Fillion', 2005)
USING TTL 86400;
將 JSON \{
插入 NerdMovies 中。`INSERT` 陳述式會為資料表中特定列寫入一個或多個欄位。請注意,由於列是由其 movie'':
Serenity'', director'':
Joss Whedon'', ``year'': 2005}'
p.
PRIMARY KEY
識別,因此至少必須指定組成該列的欄位。使用 VALUES
語法時,必須提供要插入的欄位清單。使用 JSON
語法時,它們是選用的。有關更多詳細資料,請參閱 INSERT JSON
區段。
請注意,與 SQL 不同,INSERT
預設不會檢查列的先前存在性:如果之前不存在列,則會建立列;否則,會更新列。此外,沒有辦法知道發生建立或更新的哪一個動作。
然而,可以使用 IF NOT EXISTS
條件,僅在插入之前不存在列時才插入。但請注意,使用 IF NOT EXISTS
會產生不可忽略的效能成本(內部會使用 Paxos),因此應該謹慎使用。
INSERT
的所有更新都會以原子方式和隔離方式套用。
UPDATE
語法
bc(syntax)..
::= UPDATE
( USING ( AND )* )?
SET ( `,' )*
WHERE
( IF ( AND 條件 )* )?
::= ='
+' | `-') ( | | )
| `=' (
| `=' `+'
| `[' `]' `='
| `.' `='
::=
| CONTAINS (KEY)?
| IN
| `[' `]'
| `[' `]' IN
| `.'
| `.' IN
::= `<' | `⇐' | `=' | `!=' | `>=' | `>'
::= ( | `(' ( ( `,' )* )? `)')
::= ( AND )*
::= ='
,' )*
| `(' ()' `='
,' )*
| IN `(' ( ( `,' )* )? `)'
| IN
| `(' ()' IN `(' ( ( `,' )* )? `)'
,' )* `)' IN
| `(' (
::= TIMESTAMP
| TTL
p.
範例
bc(sample)..
UPDATE NerdMovies USING TTL 400
SET director = `Joss Whedon',
main_actor = `Nathan Fillion',
year = 2005
WHERE movie = `Serenity';
UPDATE UserActions SET total = total + 2 WHERE user = B70DE1D0-9908-4AE3-BE34-5573E5B09F14 AND action = click';
`UPDATE` 陳述式會為資料表中特定列寫入一個或多個欄位。
p.
<where-clause>
用於選取要更新的列,且必須包含組成 PRIMARY KEY
的所有欄位。其他欄位值會在 SET
關鍵字之後透過 <assignment>
指定。
請注意,與 SQL 不同,UPDATE
預設不會檢查列的先前存在(除非透過使用 <condition>
,請參閱下方):如果之前不存在列,則會建立列,否則會更新列。此外,沒有辦法知道是否發生建立或更新。
不過,可以透過 IF
對某些欄位使用條件,這種情況下,除非符合條件,否則不會更新列。但是,請注意,使用 IF
條件會產生不可忽略的效能成本(內部會使用 Paxos),因此應謹慎使用。
在 UPDATE
陳述式中,同一個分區金鑰內的所有更新都會以原子方式和隔離方式套用。
<assignment>
的 c = c + 3
形式用於遞增/遞減計數器。等號 =
之後的識別碼必須與等號 =
之前的識別碼相同(計數器只支援遞增/遞減,不支援指定特定值)。
<assignment>
的 id = id + <collection-literal>
和 id[value1] = value2
形式適用於集合。請參閱 相關區段 以取得更多詳細資料。
<assignemt>
的 id.field = <term>
形式用於設定非凍結使用者定義類型上單一欄位的數值。
DELETE
語法
bc(syntax)..
::= DELETE ( ( `,' )* )?
FROM
( USING TIMESTAMP )?
WHERE
( IF ( EXISTS | ( ( AND )*) ) )?
::=
| `[' `]'
| `.'
::= ( AND )*
::=
| (' (
,' )* )'
,' )* `)' IN `(' ( ( `,' )* )? `)'
| IN `(' ( ( `,' )* )? `)'
| IN
| `(' (
| `(' (,' )* `)' IN
::= `=' | `<' | `>' | `⇐' | `>='
::= ( | `(' ( ( `,' )* )? `)')
::= ( | `!=')
| CONTAINS (KEY)?
| IN
| `[' `]' ( | `!=')
| `[' `]' IN
| `.' ( | `!=')
| `.' IN
範例
bc(sample)..
DELETE FROM NerdMovies USING TIMESTAMP 1240003134 WHERE movie = `Serenity';
DELETE phone FROM Users WHERE userid IN (C73DE1D3-AF08-40F3-B124-3FF3E5109F22, B70DE1D0-9908-4AE3-BE34-5573E5B09F14);
p.
DELETE
敘述會刪除欄位和列。如果在 DELETE
關鍵字後直接提供欄位名稱,則僅會從 <where-clause>
指出的列中刪除這些欄位。<selection>
中的 id[value]
語法適用於非凍結的集合(請參閱 集合區段 以取得更多詳細資料)。id.field
語法適用於刪除非凍結的使用者定義類型。否則,會移除整列。<where-clause>
指定要刪除哪些列。可以使用 IN
子句使用一個敘述刪除多列。可以使用不等於運算子(例如 >=
)刪除一連串列。
DELETE
支援 TIMESTAMP
選項,其語意與 UPDATE
敘述相同。
在 DELETE
敘述中,同一個分割鍵中的所有刪除動作會以原子方式和獨立方式套用。
DELETE
作業可以使用 IF
子句進行條件設定,類似於 UPDATE
和 INSERT
敘述。不過,與 INSERT
和 UPDATE
敘述一樣,這會產生不可忽略的效能成本(在內部,會使用 Paxos),因此應謹慎使用。
批次
語法
bc(syntax)..
::= BEGIN ( UNLOGGED | COUNTER ) BATCH
( USING ( AND )* )?
( `;' )*
APPLY BATCH
::=
|
|
::= TIMESTAMP
p.
範例
bc(sample).
BEGIN BATCH
INSERT INTO users (userid, password, name) VALUES (`user2', `ch@ngem3b', `second user');
UPDATE users SET password = `ps22dhds' WHERE userid = `user3';
INSERT INTO users (userid, password) VALUES (`user4', `ch@ngem3c');
DELETE name FROM users WHERE userid = `user1';
APPLY BATCH;
BATCH
敘述會將多個修改敘述(插入/更新和刪除)群組成一個單一敘述。它有幾個目的
-
在批次處理多個更新時,它會節省用戶端和伺服器(有時是伺服器協調器和複製品)之間的網路往返。
-
屬於特定分割鍵的
BATCH
中的所有更新會獨立執行。 -
預設情況下,批次中的所有作業都會執行為
LOGGED
,以確保所有變更最終完成(或都不會完成)。請參閱UNLOGGED
的注意事項以取得更多詳細資料。
請注意
-
BATCH
敘述只能包含UPDATE
、INSERT
和DELETE
敘述。 -
批次並非 SQL 交易的完整類比。
-
如果未為每個作業指定時間戳記,則所有作業都將套用相同時間戳記。由於 Cassandra 在 時間戳記相等 的情況下會進行衝突解決程序,因此作業的套用順序可能與
BATCH
陳述式中所列的順序不同。若要強制執行特定的作業順序,您必須指定每個作業的時間戳記。
UNLOGGED
預設情況下,Cassandra 會使用批次記錄檔確保批次中的所有作業最終完成,否則都不會完成(但請注意,作業僅在單一分割區中隔離)。
當批次跨越多個分割區時,批次原子性會產生效能損失。如果您不希望產生此損失,您可以使用 UNLOGGED
選項告知 Cassandra 略過批次記錄檔。如果使用 UNLOGGED
選項,失敗的批次可能會導致修補程式僅部分套用。
<option>
BATCH
支援 TIMESTAMP
選項,其語意與 UPDATE
陳述式中所述的語意類似(時間戳記套用至批次中的所有陳述式)。但是,如果使用,則 不得 在批次中的陳述式中使用 TIMESTAMP
。
查詢
SELECT
語法
bc(syntax)..
::= SELECT ( JSON )?
FROM
( WHERE )?
( GROUP BY )?
( ORDER BY )?
( PER PARTITION LIMIT )?
( LIMIT )?
( ALLOW FILTERING )?
::= DISTINCT?
::= (AS )? ( `,' (AS )? )*
| `*'
::=
|
| WRITETIME (' `)'
,' ))? `)'
| MAXWRITETIME `(' `)'
| COUNT `(' `' `)'
| TTL `(' `)'
| CAST `(' AS `)'
| `(' ( (
| `.'
| `[' `]'
| `[' ? .. ? `]'
::= ( AND )*
::=
| (' (
,' )* )'
,' )* `)' IN `(' ( ( `,' )* )? `)'
| IN `(' ( ( `,' )* )? `)'
| `(' (
| TOKEN `(' ( `,' )* `)'
::= =' | `<' | `>' | `⇐' | `>=' | CONTAINS | CONTAINS KEY
,' )*
::= (
::= ( ,' )*
,' )* `)'
::= ( ASC | DESC )?
::= `(' (
p.
範例
bc(sample)..
SELECT name, occupation FROM users WHERE userid IN (199, 200, 207);
SELECT JSON name, occupation FROM users WHERE userid = 199;
SELECT name AS user_name, occupation AS user_occupation FROM users;
SELECT time, value
FROM events
WHERE event_type = `myEvent'
AND time > `2011-02-03'
AND time ⇐ `2012-01-01'
SELECT COUNT (*) FROM users;
SELECT COUNT (*) AS user_count FROM users;
SELECT
陳述式會讀取資料表中一或多列的一或多列。它會傳回列的結果集,其中每一列都包含與查詢相符的欄位集合。如果使用了 JSON
關鍵字,每一列的結果只會包含一個名為 `json'' 的欄位。請參閱 `SELECT JSON
章節以取得更多詳細資料。
<select-clause>
<select-clause>
會決定哪些欄位需要查詢並傳回結果集中。它包含逗號分隔的清單或萬用字元 (*
) 以選取資料表中定義的所有欄位。請注意,對於萬用字元 SELECT
查詢,傳回的欄位順序未指定,且無法保證在 Cassandra 版本之間保持穩定。
<selector>
是要擷取的欄位名稱,或一個或多個 <term>
的 <function>
。允許使用的函數與 <term>
相同,並說明於 函數區段 中。除了這些一般函數之外,WRITETIME
和 MAXWRITETIME
(resp. TTL
) 函數允許選取欄位插入的時間戳記 (resp. 欄位的生存時間 (以秒為單位) (或如果欄位沒有設定到期日,則為 null)),而 CAST
函數可用於將一種資料類型轉換為另一種資料類型。WRITETIME
和 TTL
函數無法用於多單元格欄位,例如非凍結集合或非凍結使用者定義類型。
此外,可以使用 [ <term> ]
選取個別的映射和集合值。對於映射,如果存在此類輸入,這會傳回對應於金鑰的值。對於集合,如果存在且因此主要是檢查元素是否存在,這會傳回選取的金鑰。也可以使用 [ <term> … <term> `]
選取集合或映射的區段,其中兩個邊界都可以省略。
任何 <selector>
都可以使用 AS
關鍵字設定別名 (請參閱範例)。請注意,<where-clause>
和 <order-by>
子句應使用欄位的原始名稱,而非其別名來參照欄位。
COUNT
關鍵字可用於括住 *
的括號。如果是這樣,查詢會傳回單一結果:符合查詢的列數。請注意,COUNT(1)
受支援作為別名。
<where-clause>
<where-clause>
指定必須查詢哪些列。它由 PRIMARY KEY
的一部分的欄位上的關係組成,和/或在它們上定義了 次要索引。
並非所有關係都允許在查詢中。例如,分割鍵上不支援非等於關係 (其中 IN
被視為等於關係) (但請參閱下方 TOKEN
方法的使用,以對分割鍵執行非等於查詢)。此外,對於給定的分割鍵,群集欄位會引發列的排序,而對它們的關係會限制為允許選取 連續 (針對排序) 的列集。例如,給定
bc(sample).
CREATE TABLE posts (
userid text,
blog_title 文字,
posted_at 時間戳,
entry_title 文字,
content 文字,
category 整數,
主鍵 (userid, blog_title, posted_at)
)
允許以下查詢
bc(sample).
SELECT entry_title, content FROM posts WHERE userid=`john doe' AND blog_title=`John'`s Blog' AND posted_at >= `2012-01-01' AND posted_at < `2012-01-31'
但以下查詢不允許,因為它未選取連續的列集 (且我們假設未設定次要索引)
bc(sample).
SELECT entry_title, content FROM posts WHERE userid=`john doe' AND posted_at >= `2012-01-01' AND posted_at < `2012-01-31'
指定關聯時,可以在 PARTITION KEY
欄位上使用 TOKEN
函數進行查詢。在這種情況下,將根據 PARTITION_KEY
的權杖選取列,而不是根據值。請注意,金鑰的權杖取決於使用的分割器,特別是 RandomPartitioner 無法產生有意義的順序。另請注意,排序分割器總是按位元組對權杖值進行排序 (因此,即使分割金鑰為 int 類型,token(-1) > token(0)
)。範例
bc(sample).
SELECT * FROM posts WHERE token(userid) > token(`tom') AND token(userid) < token(`bob')
此外,IN
關聯僅允許在分割金鑰的最後一欄和完整主鍵的最後一欄上使用。
也可以使用元組表示法將 `group'' `CLUSTERING COLUMNS
一起放入關聯中。例如
bc(sample).
SELECT * FROM posts WHERE userid=`john doe' AND (blog_title, posted_at) > (`John'`s Blog', `2012-01-01')
將要求在分群順序中具有 `John’s Blog'' 作為 `blog_tile
和 2012-01-01' 作為 `posted_at
的列之後排序的所有列。特別是,具有 post_at ⇐ '2012-01-01'
的列將被傳回,只要它們的 blog_title > 'John''s Blog'
,而以下情況並非如此
bc(sample).
SELECT * FROM posts WHERE userid=`john doe' AND blog_title > `John'`s Blog' AND posted_at > `2012-01-01'
元組表示法也可以用於 CLUSTERING COLUMNS
上的 IN
子句
bc(sample).
SELECT * FROM posts WHERE userid=`john doe' AND (blog_title, posted_at) IN `John'`s Blog', `2012-01-01), (’Extreme Chess', `2014-06-01'
CONTAINS
算子只能用於集合欄位 (清單、集合和對應)。對於對應,CONTAINS
適用於對應值。CONTAINS KEY
算子只能用於對應欄位,並適用於對應金鑰。
<order-by>
ORDER BY
選項允許選擇回傳結果的順序。它採用一組欄位名稱作為引數,以及欄位的順序(ASC
表示遞增,DESC
表示遞減,省略順序等於 ASC
)。目前可能的排序受到限制(取決於表格 CLUSTERING ORDER
)
-
如果表格未定義任何特定的
CLUSTERING ORDER
,則允許的排序順序為叢集欄位產生的順序,以及該順序的相反順序。 -
否則,允許的排序順序為
CLUSTERING ORDER
選項的順序,以及相反的順序。
<group-by>
GROUP BY
選項允許將所有選取的列,其值與一組欄位相同,濃縮成單一列。
使用 GROUP BY
選項時,只能在分割鍵層級或叢集欄位層級對列進行分組。因此,GROUP BY
選項只接受主鍵中的主鍵欄位名稱作為引數,且順序為主鍵順序。如果主鍵欄位受到等式限制,則不需要在 GROUP BY
子句中顯示。
聚合函數會為每個群組產生個別值。如果未指定 GROUP BY
子句,則聚合函數會為所有列產生單一值。
如果在有 GROUP BY
的陳述中,選取一欄位而沒有聚合函數,則會回傳每個群組中遇到的第一個值。
LIMIT
和 PER PARTITION LIMIT
LIMIT
選項用於 SELECT
陳述,用於限制查詢回傳的列數,而 PER PARTITION LIMIT
選項用於限制查詢為特定分割區回傳的列數。請注意,兩種限制類型都可以在同一個陳述中使用。
ALLOW FILTERING
預設情況下,CQL 只允許不包含伺服器端 filtering'' 的選取查詢,亦即我們知道所有(即時)記錄讀取會在結果集中(可能部分)回傳的查詢。原因是那些
non filtering'' 查詢在效能上可預測,因為它們會在與查詢 回傳 的資料量成正比的時間內執行(可透過 LIMIT
控制)。
ALLOW FILTERING
選項允許明確允許(一些)需要過濾的查詢。請注意,使用 ALLOW FILTERING
的查詢因此可能會有不可預測的效能(根據上述定義),亦即即使是選取少數記錄的查詢 也可能 會表現出取決於叢集中儲存的資料總量的效能。
例如,考量下列表格,其中包含使用者的個人資料,以及他們的出生年份(具有次要索引)和居住國家
bc(sample)..
CREATE TABLE users (
使用者名稱文字主鍵,
名字文字,
姓氏文字,
出生年份整數,
國家文字
)
在使用者上建立索引(birth_year);
p.
那麼下列查詢是有效的
bc(sample).
從使用者中選取全部;
從使用者中選取名字、姓氏,其中出生年份等於 1981;
因為在兩種情況下,Cassandra 保證這些查詢效能會與傳回的資料量成正比。特別是,如果沒有使用者出生於 1981 年,那麼第二個查詢效能將不會依賴儲存在資料庫中的使用者設定檔數量(至少不是直接依賴:由於次要索引實作考量,這個查詢可能仍然會依賴叢集中的節點數量,而節點數量間接依賴於儲存的資料量。儘管如此,節點數量永遠會比儲存的使用者設定檔數量低好幾個數量級)。當然,這兩個查詢實際上都可能傳回非常大的結果集,但傳回的資料量永遠都可以透過新增 LIMIT
來控制。
然而,下列查詢將會遭到拒絕
bc(sample).
從使用者中選取名字、姓氏,其中出生年份等於 1981 且國家等於 `FR';
因為 Cassandra 無法保證即使查詢結果很小,也不會必須掃描大量資料。通常,它會掃描所有出生於 1981 年的使用者索引項目,即使實際上只有少數幾位來自法國。然而,如果你 `知道自己在做什麼'',你可以透過使用 `ALLOW FILTERING
來強制執行這個查詢,因此下列查詢是有效的
bc(sample).
從使用者中選取名字、姓氏,其中出生年份等於 1981 且國家等於 `FR' ALLOW FILTERING;
資料庫角色
建立角色
語法
bc(syntax)..
::= 建立角色 ( 如果不存在 )? ( 使用 ( 且 )* )?
::= 密碼 =
| 登入 =
| 超級使用者 =
| 選項 =
p.
範例
bc(sample).
建立角色 new_role;
建立角色 alice 使用密碼 = `password_a' 且登入 = true;
建立角色 bob,密碼為 `password_b',並具有登入權限和超級使用者權限。
建立角色 carlos,選項為 \{ `custom_option1' : `option1_value', `custom_option2' : 99 };
預設情況下,角色不具有 LOGIN
權限或 SUPERUSER
狀態。
權限會授予角色對資料庫資源的存取權,資源類型包括鍵空間、表格、函數和角色本身。角色可以授予其他角色,以建立階層式權限結構;在這些階層中,權限和 SUPERUSER
狀態會被繼承,但 LOGIN
權限不會。
如果角色具有 LOGIN
權限,用戶端在連線時可以識別為該角色。在該連線期間,用戶端將取得授予該角色的所有角色和權限。
只有具有資料庫角色資源 CREATE
權限的用戶端可以發出 CREATE ROLE
要求(請參閱以下 相關部分),除非該用戶端是 SUPERUSER
。Cassandra 中的角色管理是可插入的,自訂實作可能只支援列出的選項的一部分。
如果角色名稱包含非字母數字字元,則應加上引號。
ALTER ROLE
語法
bc(syntax)..
::= ALTER ROLE (IF EXISTS)? ( WITH ( AND )* )?
::= 密碼 =
| 登入 =
| 超級使用者 =
| 選項 =
p.
範例
bc(sample).
ALTER ROLE bob,密碼為 `PASSWORD_B',且超級使用者為 false;
如果角色不存在,該陳述式將傳回錯誤,除非使用 IF EXISTS
,在這種情況下,操作為 no-op。
執行 ALTER ROLE
陳述式的條件
-
用戶端必須具有
SUPERUSER
狀態才能變更另一個角色的SUPERUSER
狀態 -
用戶端無法變更目前持有的任何角色的
SUPERUSER
狀態 -
用戶端只能修改登入時識別的角色的特定屬性(例如
PASSWORD
) -
若要修改角色屬性,用戶端必須取得該角色的
ALTER
權限
DROP ROLE
語法
bc(syntax)..
::= DROP ROLE ( IF EXISTS )?
p.
範例
bc(sample).
DROP ROLE alice;
DROP ROLE IF EXISTS bob;
DROP ROLE
要求用戶端對相關角色擁有 DROP
權限。此外,用戶端無法 DROP
登入時識別的角色。最後,只有擁有 SUPERUSER
狀態的用戶端才能 DROP
另一個 SUPERUSER
角色。
嘗試刪除不存在的角色會導致無效的查詢條件,除非使用 IF EXISTS
選項。如果使用該選項且角色不存在,則陳述式為 no-op。
GRANT ROLE
語法
bc(syntax).
::= GRANT TO
範例
bc(sample).
GRANT report_writer TO alice;
此陳述式會將 report_writer
角色授與 alice
。授與 report_writer
的任何權限也會由 alice
取得。
角色會模擬為有向非循環圖,因此不允許循環授與。下列範例會導致錯誤條件
bc(sample).
GRANT role_a TO role_b;
GRANT role_b TO role_a;
bc(sample).
GRANT role_a TO role_b;
GRANT role_b TO role_c;
GRANT role_c TO role_a;
REVOKE ROLE
語法
bc(syntax).
::= REVOKE FROM
範例
bc(sample).
REVOKE report_writer FROM alice;
此陳述式會從 alice
撤銷 report_writer
角色。alice
透過 report_writer
角色取得的任何權限也會被撤銷。
CREATE USER
在 Cassandra 2.2 中導入角色之前,驗證和授權是基於 USER
概念。為了向後相容性,已保留舊語法,而以 USER
為中心的陳述式已成為以 ROLE
為基礎的等義詞。
語法
bc(syntax)..
::= CREATE USER ( IF NOT EXISTS )? ( WITH PASSWORD )? ()?
::= SUPERUSER
| NOSUPERUSER
p.
範例
bc(sample).
建立使用者 alice 密碼為 `password_a` SUPERUSER;
建立使用者 bob 密碼為 `password_b` NOSUPERUSER;
建立使用者
等同於 建立角色
,其中 登入
選項為 true
。因此,以下成對的陳述式等同
bc(sample)..
建立使用者 alice 密碼為 `password_a` SUPERUSER;
建立角色 alice 密碼為 `password_a` 並登入為 true 且 SUPERUSER 為 true;
建立使用者 alice 密碼為 `password_a` SUPERUSER 如果不存在;
建立角色 alice 密碼為 `password_a` 並登入為 true 且 SUPERUSER 為 true 如果不存在;
建立使用者 alice 密碼為 `password_a` NOSUPERUSER;
建立角色 alice 密碼為 `password_a` 並登入為 true 且 SUPERUSER 為 false;
建立使用者 alice 密碼為 `password_a` NOSUPERUSER;
建立角色 alice 使用密碼 = `password_a' 且登入 = true;
建立使用者 alice 密碼為 `password_a`;
建立角色 alice 使用密碼 = `password_a' 且登入 = true;
p.
資料庫身分
資料控制
權限
資源上的權限授予角色;Cassandra 中有數種不同類型的資源,且每種類型都以階層方式建模
-
資料資源、鍵空間和資料表的階層結構為
ALL KEYSPACES
→KEYSPACE
→TABLE
-
函數資源的結構為
ALL FUNCTIONS
→KEYSPACE
→FUNCTION
-
代表角色的資源結構為
ALL ROLES
→ROLE
-
代表 JMX ObjectNames(對應到 MBeans/MXBeans 組合)的資源結構為
ALL MBEANS
→MBEAN
可以在這些階層的任何層級授予權限,且權限會向下傳遞。因此,在鏈中的較高層級資源上授予權限會自動在較低層級的所有資源上授予相同的權限。例如,在 KEYSPACE
上授予 SELECT
權限會自動在該 KEYSPACE
中的所有 TABLES
上授予 SELECT
權限。同樣地,在 ALL FUNCTIONS
上授予權限會在每個已定義的函數上授予權限,無論其作用範圍在於哪個鍵空間。也可以在特定鍵空間的作用範圍內授予所有函數權限。
現有客戶端工作階段可見權限修改;換句話說,在權限變更後不需要重新建立連線。
可用的完整權限組為
-
建立
-
變更
-
刪除
-
選擇
-
修改
-
授權
-
描述
-
執行
-
取消遮罩
-
選擇遮罩
並非所有權限都適用於每種類型的資源。例如,EXECUTE
僅與函數或 mbean 相關;授予 EXECUTE
在表示表格的資源上是沒有意義的。嘗試對無法套用的資源GRANT
權限會導致錯誤回應。以下說明哪些權限可以授予哪些類型的資源,以及哪些陳述是由該權限啟用的。
權限 | 資源 | 操作 | |||
---|---|---|---|---|---|
|
|
|
|||
|
|
在指定的鍵空間中建立 |
|||
|
|
在任何鍵空間中建立 |
|||
|
|
在鍵空間中建立 |
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
建立 |
|||
|
|
建立 |
|||
|
|
建立 |
|||
|
|
在任何角色上 |
|||
|
|
|
|||
|
|
|
|||
|
|
在指定的鍵空間中 |
|||
|
|
|
|||
|
|
在任何鍵空間中 |
|||
|
|
在鍵空間中 |
|||
|
|
|
|||
|
|
在任何角色上 |
|||
|
|
|
|||
|
|
在任何表格上 |
|||
|
|
在鍵空間中的任何表格上 |
|||
|
|
在指定的表格上 |
|||
|
|
在任何 mbean 上呼叫 getter 方法 |
|||
|
|
在任何與萬用字元模式相符的 mbean 上呼叫 getter 方法 |
|||
|
|
在指定的 mbean 上呼叫 getter 方法 |
|||
|
|
在任何表格上 |
|||
|
|
在鍵空間中的任何表格上 |
|
|
|
|
|
在任何 mbean 上呼叫 setter 方法 |
|||
|
|
呼叫與萬用字元模式相符的任何 mbean 上的 setter 方法 |
|||
|
|
呼叫命名 mbean 上的 setter 方法 |
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
@ALL MBEANS |
從平台的 MBeanServer 擷取任何 mbean 的元資料 |
|||
|
@MBEANS |
從平台的 MBeanServer 擷取與萬用字元模式相符的任何 mbean 的元資料 |
|||
|
@MBEAN |
從平台的 MBeanServer 擷取命名 mbean 的元資料 |
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
對任何 mbean 執行作業 |
|||
|
|
對與萬用字元模式相符的任何 mbean 執行作業 |
|||
|
|
對命名 mbean 執行作業 |
|||
|
|
查看任何表格上遮罩欄位的明確內容 |
|||
|
|
查看鍵空間中任何表格上遮罩欄位的明確內容 |
|||
|
|
查看指定表格上遮罩欄位的明確內容 |
|||
|
|
|
|||
|
|
|
|||
|
|
|
授予權限
語法
bc(syntax)..
::= 授予 ( 所有 ( 權限 )? | ( 權限 )? ) 給
::= 建立 | 變更 | 刪除 | 選取 | 修改 | 授權 | 描述 | 取消遮罩 | 選取遮罩執行
::= 所有鍵空間
| 鍵空間
| ( 表格 )?
| 所有角色
| 角色
| 所有函數 ( 在鍵空間中 )?
| 函數
| 所有 MBean
| ( MBean | MBean )
p.
範例
bc(sample).
授予 data_reader 所有鍵空間的 SELECT 權限;
這會讓具有 data_reader
角色的任何使用者都能對所有鍵空間中的任何表格執行 SELECT
陳述式
bc(sample).
授予 data_writer 鍵空間 keyspace1 的 MODIFY 權限;
這會讓具有 data_writer
角色的任何使用者都能對 keyspace1
鍵空間中的所有表格執行 UPDATE
、INSERT
、UPDATE
、DELETE
和 TRUNCATE
查詢
bc(sample).
授予 schema_owner keyspace1.table1 的 DROP 權限;
這會讓具有 schema_owner
角色的任何使用者都能 DROP
keyspace1.table1
。
bc(sample).
授予 report_writer 函數 keyspace1.user_function( int ) 的 EXECUTE 權限;
這會讓具有 report_writer
角色的任何使用者都能執行使用函數 keyspace1.user_function( int )
的 SELECT
、INSERT
和 UPDATE
查詢
bc(sample).
授予 role_admin 所有角色的 DESCRIBE 權限;
這會讓具有 role_admin
角色的任何使用者都能使用 LIST ROLES
陳述式檢視系統中的任何和所有角色
撤銷權限
語法
bc(syntax)..
::= 撤銷 ( 所有 ( 權限 )? | ( 權限 )? ) 給
::= 建立 | 變更 | 刪除 | 選取 | 修改 | 授權 | 描述 | 取消遮罩 | 選取遮罩執行
::= 所有鍵空間
| 鍵空間
| ( 表格 )?
| 所有角色
| 角色
| 所有函數 ( 在鍵空間中 )?
| 函數
| 所有 MBean
| ( MBean | MBean )
p.
範例
bc(sample)..
撤銷 data_reader 所有鍵空間的 SELECT 權限;
撤銷 data_writer 鍵空間 keyspace1 的 MODIFY 權限;
撤銷 schema_owner keyspace1.table1 的 DROP 權限;
撤銷 report_writer 函數 keyspace1.user_function( int ) 的 EXECUTE 權限;
撤銷 role_admin 所有角色的 DESCRIBE 權限;
p.
列出權限
語法
bc(syntax)..
::= 列出 ( 所有 ( 權限 )? | )
( 開啟 )?
( OF ( NORECURSIVE )? )?
::= 所有鍵空間
| 鍵空間
| ( 表格 )?
| 所有角色
| 角色
| 所有函數 ( 在鍵空間中 )?
| 函數
| 所有 MBean
| ( MBean | MBean )
p.
範例
bc(sample).
列出 alice 的所有權限;
顯示授予 alice
的所有權限,包括從任何其他角色傳遞取得的權限。
bc(sample).
列出 bob 在 keyspace1.table1 上的所有權限;
顯示授予 bob
的 keyspace1.table1
上的所有權限,包括從任何其他角色傳遞取得的權限。這也包括資源階層中較高層級的任何權限,這些權限可以套用至 keyspace1.table1
。例如,如果 bob
對 keyspace1
擁有 ALTER
權限,這將會包含在這個查詢的結果中。加入 NORECURSIVE
開關會將結果限制為僅授予 bob
或 bob
的角色的權限。
bc(sample).
列出 carlos 的 SELECT 權限;
顯示授予 carlos
或 carlos
的任何角色的任何權限,限於任何資源上的 SELECT
權限。
資料類型
CQL 支援豐富的資料類型,供定義在資料表中的欄位使用,包括集合類型。除了這些原生
和集合類型外,使用者也可以提供自訂類型(透過延伸 AbstractType
的 JAVA 類別,由
Cassandra 載入)。因此,類型的語法如下
bc(syntax)..
::=
|
|
| // 用於自訂類型。JAVA 類別的完整限定名稱
::= ascii
| bigint
| blob
| boolean
| counter
| date
| decimal
| double
| float
| inet
| int
| smallint
| text
| time
| timestamp
| timeuuid
| tinyint
| uuid
| varchar
| varint
::= list <' `>'
,' )* `>'
| set `<' `>'
| map `<' `,' `>'
::= tuple `<' (
p. 請注意,原生類型是關鍵字,因此不分大小寫。不過,它們不是保留字。
下表提供原生資料類型的其他資訊,以及每種類型支援的 常數 類型
類型 | 支援的常數 | 說明 |
---|---|---|
|
字串 |
ASCII 字元字串 |
|
整數 |
64 位元有號長整數 |
|
blob |
任意位元組(無驗證) |
|
布林值 |
真或假 |
|
整數 |
計數器欄位(64 位元有號值)。有關詳細資訊,請參閱 計數器 |
|
整數、字串 |
日期(無對應時間值)。有關更多資訊,請參閱下方的 使用日期。 |
|
整數、浮點數 |
變動精度十進位 |
|
整數 |
64 位元 IEEE-754 浮點數 |
|
整數、浮點數 |
32 位元 IEEE-754 浮點數 |
|
字串 |
IP 位址。長度可以為 4 位元組(IPv4)或 16 位元組(IPv6)。沒有 |
|
整數 |
32 位元有號整數 |
|
整數 |
16 位元有號整數 |
|
字串 |
UTF8 編碼字串 |
|
整數、字串 |
具有奈秒精度的時間。有關更多資訊,請參閱下方的 使用時間。 |
|
整數、字串 |
時間戳記。字串常數允許將時間戳記輸入為日期,有關更多資訊,請參閱下方的 使用時間戳記。 |
|
uuids |
類型 1 UUID。這通常用作「無衝突」時間戳記。另請參閱 Timeuuid 的函數 |
|
整數 |
8 位元有號整數 |
|
uuids |
類型 1 或類型 4 UUID |
|
字串 |
UTF8 編碼字串 |
|
整數 |
變動精度整數 |
有關如何使用集合類型的更多資訊,請參閱下方的 使用集合 部分。
使用時間戳記
timestamp
類型的值編碼為 64 位元有號整數,表示自稱為「紀元」的標準基準時間(1970 年 1 月 1 日格林威治時間 00:00:00)以來的毫秒數。
時間戳記可以在 CQL 中輸入為簡單的長整數,提供自上述定義的紀元以來的毫秒數。
它們也可以輸入為下列任何 ISO 8601 格式的字串文字,每個格式都表示格林威治時間 2011 年 3 月 2 日上午 04:05:00 的時間和日期。
-
2011-02-03 04:05+0000
-
2011-02-03 04:05:00+0000
-
2011-02-03 04:05:00.000+0000
-
2011-02-03T04:05+0000
-
2011-02-03T04:05:00+0000
-
2011-02-03T04:05:00.000+0000
上面的 +0000
是 RFC 822 4 位元時間區域規格;+0000
指的是格林威治標準時間。美國太平洋標準時間是 -0800
。如果需要,可以省略時間區域,日期會被解釋為協調的 Cassandra 節點所設定的時間區域。
-
2011-02-03 04:05
-
2011-02-03 04:05:00
-
2011-02-03 04:05:00.000
-
2011-02-03T04:05
-
2011-02-03T04:05:00
-
2011-02-03T04:05:00.000
不過,依賴預期的時間區域設定有明顯的困難,因此建議在可行的情況下,始終為時間戳指定時間區域。
如果日期是唯一重要的部分,也可以省略時間。
-
2011-02-03
-
2011-02-03+0000
在這種情況下,時間會預設為 00:00:00,在指定或預設的時間區域中。
使用日期
date
類型的值編碼為 32 位元無符號整數,代表以「基準時間」為範圍中心的日期數目 (2^31)。基準時間是 1970 年 1 月 1 日。
可以在 CQL 中輸入日期,格式為如上所定義的無符號整數。
也可以使用下列格式輸入字串字面值
-
2014-01-01
使用時間
time
類型的值編碼為 64 位元有符號整數,代表自午夜以來的奈秒數。
可以在 CQL 中輸入時間,格式為簡單的長整數,提供自午夜以來的奈秒數。
也可以使用下列任何格式輸入字串字面值
-
08:12:54
-
08:12:54.123
-
08:12:54.123456
-
08:12:54.123456789
計數器
counter
類型用於定義計數器欄位。計數器欄位是一個欄位,其值為 64 位元有符號整數,並且支援 2 個運算:增量和減量 (語法請參閱 UPDATE
)。請注意,無法設定計數器的值。計數器在第一次增量/減量之前不存在,而第一次增量/減量會視為先前的值為 0。支援刪除計數器欄位,但有一些限制 (更多資訊請參閱 Cassandra Wiki)。
計數器類型的使用受到下列限制
-
無法用於表格
PRIMARY KEY
的一部分欄位。 -
包含計數器的表格只能包含計數器。換句話說,表格中所有 PRIMARY KEY 以外的欄位都必須具有計數器類型,或都沒有計數器類型。
處理集合
值得注意的特徵
集合是用來儲存/非正規化相對較少量的資料。它們很適合用於「給定使用者的電話號碼」、「套用於電子郵件的標籤」等事物。但當項目預期會無限增加(「給定使用者傳送的所有訊息」、「感測器註冊的事件」…)時,集合就不再適用了,應該使用特定表格(帶有分群欄位)。具體來說,集合有以下限制
-
集合總是完整讀取(且在內部讀取時不會分頁)。
-
集合不能有超過 65535 個元素。更精確地說,雖然可以插入超過 65535 個元素,但無法讀取超過前 65535 個元素(請參閱 CASSANDRA-5428 以取得詳細資訊)。
-
雖然在集合和映射上的插入操作在內部永遠不會發生寫入前讀取,但清單上的某些操作會發生(請參閱下方清單部分以取得詳細資訊)。因此,建議在可能的情況下優先使用集合而非清單。
請注意,雖然某些限制在未來可能會或可能不會放寬,但集合用於非正規化少量資料的原則會保持不變。
映射
map
是一組 類型化 的鍵值對,其中鍵是唯一的。此外,請注意映射會根據其鍵內部排序,因此總是會按該順序傳回。若要建立類型為 map
的欄位,請使用 map
關鍵字,後接以逗號分隔的鍵和值類型,並以尖括號括起來。例如
bc(sample).
CREATE TABLE users (
id text PRIMARY KEY,
given text,
surname text,
favs map<text, text> // 一個文字鍵和文字值的映射
)
寫入 map
資料會使用類似 JSON 的語法。若要使用 INSERT
寫入記錄,請將整個映射指定為 JSON 式關聯陣列。注意:此表單總是會取代整個映射。
bc(sample).
INSERT INTO users (id, given, surname, favs)
VALUES (`jsmith', `John', `Smith', \{ `fruit' : `apple', `band' : `Beatles' })
新增或更新現有映射的鍵值,可透過在 `UPDATE` 陳述式中對映射欄位加上索引,或新增新的映射文字來達成
bc(sample).
UPDATE users SET favs[`author'] = `Ed Poe' WHERE id = `jsmith'
UPDATE users SET favs = favs + \{ `movie' : `Cassablanca' } WHERE id = `jsmith'
請注意,`INSERT` 和 `UPDATE` 都允許 TTL,但在這兩種情況中,TTL 設定只適用於新插入/更新的值。換句話說,
bc(sample).
UPDATE users USING TTL 10 SET favs[`color'] = `green' WHERE id = `jsmith'
只會將 TTL 套用至 `{ 'color' : 'green' }` 記錄,映射的其餘部分不受影響。
刪除映射記錄的方式為
bc(sample).
DELETE favs[`author'] FROM users WHERE id = `jsmith'
集合
set
是已輸入類型的唯一值集合。集合會根據其值排序。若要建立類型為 `set` 的欄位,請使用 `set` 關鍵字,並加上以尖括號括起來的值類型。例如
bc(sample).
CREATE TABLE images (
name text PRIMARY KEY,
owner text,
date timestamp,
tags set
);
寫入 `set` 的方式為以逗號分隔集合值,並以大括號括起來。注意:`INSERT` 永遠會取代整個集合。
bc(sample).
INSERT INTO images (name, owner, date, tags)
VALUES (`cat.jpg', `jsmith', `now', \{ `kitten', `cat', `pet' });
新增和移除集合的值,可透過 `UPDATE` 來達成,方法是新增/移除新的集合值至現有的 `set` 欄位。
bc(sample).
UPDATE images SET tags = tags + \{ `cute', `cuddly' } WHERE name = `cat.jpg';
UPDATE images SET tags = tags - \{ `lame' } WHERE name = `cat.jpg';
與映射相同,TTL(如果使用)只會套用至新插入/更新的值。
清單
list
是已輸入類型且非唯一值的集合,其中元素會依其在清單中的位置排序。若要建立類型為 `list` 的欄位,請使用 `list` 關鍵字,並加上以尖括號括起來的值類型。例如
bc(sample).
CREATE TABLE plays (
id text PRIMARY KEY,
game text,
players int,
scores list
)
請注意,如下所述,清單有一些限制和效能考量需要考量,而且建議在可能的情況下優先使用 集合 而非清單。
寫入 清單
資料會使用 JSON 風格的語法。若要使用 INSERT
寫入記錄,請將整個清單指定為 JSON 陣列。注意:INSERT
始終會取代整個清單。
bc(sample).
INSERT INTO plays (id, game, players, scores)
VALUES (`123-afde', `quake', 3, [17, 4, 2]);
可以透過將新的 JSON 風格陣列新增到現有的 清單
欄位,來新增 (附加或前置) 值到清單。
bc(sample).
UPDATE plays SET players = 5, scores = scores + [ 14, 21 ] WHERE id = `123-afde';
UPDATE plays SET players = 5, scores = [ 12 ] + scores WHERE id = `123-afde';
請注意,附加和前置並非冪等運算。這表示如果在附加或前置期間運算逾時,則不總是安全地重試運算 (因為這可能會導致記錄附加或前置兩次)。
清單也提供下列運算:透過清單中的位置設定元素、透過清單中的位置移除元素,以及移除清單中給定值的全部出現次數。不過,與所有其他集合運算相反,這三個運算會在更新前引發內部讀取,因此效能特性通常會較慢。這些運算具有下列語法
bc(sample).
UPDATE plays SET scores[1] = 7 WHERE id = `123-afde'; // 將 scores 的第 2 個元素設定為 7 (如果 scores 少於 2 個元素,會引發錯誤)
DELETE scores[1] FROM plays WHERE id = `123-afde'; // 刪除 scores 的第 2 個元素 (如果 scores 少於 2 個元素,會引發錯誤)
UPDATE plays SET scores = scores - [ 12, 21 ] WHERE id = `123-afde'; // 從 scores 中移除 12 和 21 的全部出現次數
與映射相同,TTL(如果使用)只會套用至新插入/更新的值。
使用向量
向量是特定資料類型中非 Null 值的固定大小順序。它們使用與清單相同的文字。
您可以使用下列方式定義、插入和更新向量
CREATE TABLE plays (
id text PRIMARY KEY,
game text,
players int,
scores vector<int, 3> // A vector of 3 integers
)
INSERT INTO plays (id, game, players, scores)
VALUES ('123-afde', 'quake', 3, [17, 4, 2]);
// Replace the existing vector entirely
UPDATE plays SET scores = [ 3, 9, 4] WHERE id = '123-afde';
請注意,無法變更向量的個別值,也無法選取向量的個別元素。
函式
CQL3 區分內建函式 (所謂的「原生函式」) 和 使用者定義函式。CQL3 包含下列所述的數個原生函式
轉換
cast
函式可用於將一種原生資料類型轉換為另一種原生資料類型。
下表說明 cast
函式支援的轉換。Cassandra 會自動忽略將資料類型轉換為其自身資料類型的任何轉換。
來源 | 目標 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
轉換嚴格依賴於 Java 的語意。例如,雙精度值 1 將轉換為文字值 `1.0'。
bc(sample).
SELECT avg(cast(count as double)) FROM myTable
Token
token
函數允許計算給定分區金鑰的 token。token
函數的確切簽章取決於相關的表格和叢集使用的分區器。
token
的參數類型取決於分區金鑰欄的類型。回傳類型取決於使用的分區器
-
對於 Murmur3Partitioner,回傳類型為
bigint
。 -
對於 RandomPartitioner,回傳類型為
varint
。 -
對於 ByteOrderedPartitioner,回傳類型為
blob
。
例如,在使用預設 Murmur3Partitioner 的叢集中,如果表格由下述定義
bc(sample).
CREATE TABLE users (
userid text PRIMARY KEY,
username text,
…
)
則 token
函數將採用單一 text
類型的參數(在這種情況下,分區金鑰為 userid
(沒有叢集欄,因此分區金鑰與主金鑰相同)),且回傳類型將為 bigint
。
Timeuuid 函數
now
now
函數不採用參數,並在協調器節點上產生新的唯一 timeuuid(在使用它的陳述式執行的時間)。請注意,此方法對於插入很有用,但在 WHERE
子句中基本上沒有意義。例如,下述形式的查詢
bc(sample).
SELECT * FROM myTable WHERE t = now()
根據設計永遠不會回傳任何結果,因為 now()
回傳的值保證是唯一的。
min_timeuuid
和 max_timeuuid
min_timeuuid
(或 max_timeuuid
)函數會取得 timestamp
值 t
(可以 是時間戳記或日期字串),並傳回一個對應於時間戳記 t
的假 timeuuid
,其為最小(或最大)可能的 timeuuid
。因此,例如
bc(sample).
SELECT * FROM myTable WHERE t > max_timeuuid(`2013-01-01 00:05+0000') AND t < min_timeuuid(`2013-02-02 10:00+0000')
將會選取所有 timeuuid
欄位 t
嚴格早於 2013-01-01 00:05+0000' 但嚴格晚於 `2013-02-02 10:00+0000' 的列。請注意,`t >= max_timeuuid('2013-01-01 00:05+0000')
仍然不會選取在 2013-01-01 00:05+0000' 精確產生的 `timeuuid
,而且基本上等同於 `t > max_timeuuid('2013-01-01 00:05+0000')。
警告:我們稱呼 min_timeuuid
和 max_timeuuid
產生的值為假 UUID,因為它們不符合 RFC 4122 所規定的時間基礎 UUID 產生程序。特別是,這兩個方法傳回的值不會是唯一的。這表示您應該只將這些方法用於查詢(如以上的範例)。插入這些方法的結果幾乎可以確定是一個壞主意。
時間轉換函數
提供許多函數將 `timeuuid'' 轉換為 `timestamp
或 `date`,或 `date` 轉換為其他 `原生` 類型。
函數名稱 | 輸入類型 | 說明 |
---|---|---|
|
|
將 |
|
|
將 |
|
|
將 |
|
|
將 |
|
|
將 |
|
|
將 |
|
|
將 |
聚合
聚合函數會對一組列進行運算。它們會接收每一列的值,並傳回整組的單一值。
如果 normal
欄位、scalar functions
、UDT
欄位、writetime
、maxwritetime
或 ttl
與聚合函數一起選取,則為它們傳回的值將為與查詢相符的第一列值。
CQL3 區分內建聚合(稱為「原生聚合」)和 使用者定義聚合。CQL3 包含數個原生聚合,如下所述
計數
count
函數可用於計數查詢傳回的列。範例
bc(sample).
SELECT COUNT (*) FROM plays;
SELECT COUNT (1) FROM plays;
它也可以用於計數指定欄位的非 Null 值。範例
bc(sample).
SELECT COUNT (scores) FROM plays;
使用者定義函數
使用者定義函數允許在 Cassandra 中執行使用者提供的程式碼。預設情況下,Cassandra 支援以 Java 和 JavaScript 定義函數。在 3.0.11 中已移除對其他 JSR 223 相容指令碼語言(例如 Python、Ruby 和 Scala)的支援。
UDF 是 Cassandra 架構的一部分。因此,它們會自動傳播到叢集中的所有節點。
UDF 可以「重載」- 亦即多個 UDF 具有不同的引數類型,但函數名稱相同。範例
bc(sample).
CREATE FUNCTION sample ( arg int ) …;
CREATE FUNCTION sample ( arg text ) …;
使用者定義函數容易發生選用程式語言的所有一般問題。因此,實作應針對 Null 指標例外、非法引數或任何其他潛在例外來源安全。函數執行期間的例外將導致整個陳述式失敗。
將 complex 類型(例如集合、元組類型和使用者定義類型)用作引數和傳回類型是有效的。元組類型和使用者定義類型由 DataStax Java Driver 的轉換函數處理。請參閱 Java Driver 的文件,以取得有關處理元組類型和使用者定義類型的詳細資訊。
函數的引數可以是文字或術語。也可以使用準備好的陳述式佔位符。
請注意,您可以使用雙引號字串語法來封裝 UDF 原始碼。例如
bc(sample)..
CREATE FUNCTION some_function ( arg int )
RETURNS NULL ON NULL INPUT
傳回 int
LANGUAGE java
AS return arg; ;
從 atable 選取 some_function(column) …;
更新 atable 設定 col = some_function(?) …;
p.
bc(sample).
建立類型 custom_type (txt 文字, i int);
建立函數 fct_using_udt ( udtarg frozen )
RETURNS NULL ON NULL INPUT
RETURNS text
LANGUAGE java
AS return udtarg.getString(``txt''); ;
隱含可用的 udfContext
欄位(或腳本 UDF 的繫結)提供建立新的 UDT 和元組值所需的機能。
bc(sample).
建立類型 custom_type (txt 文字, i int);
建立函數 fct_using_udt ( somearg int )
RETURNS NULL ON NULL INPUT
傳回 custom_type
LANGUAGE java
AS + UDTValue udt = udfContext.newReturnUDTValue(); + udt.setString(``txt'', ``some string''); + udt.setInt(``i'', 42); + return udt; + ;
可以在 Apache Cassandra 原始碼的 org.apache.cassandra.cql3.functions.UDFContext
中找到 UDFContext
介面的定義。
bc(sample).
public interface UDFContext
\{
UDTValue newArgUDTValue(String argName);
UDTValue newArgUDTValue(int argNum);
UDTValue newReturnUDTValue();
UDTValue newUDTValue(String udtName);
TupleValue newArgTupleValue(String argName);
TupleValue newArgTupleValue(int argNum);
TupleValue newReturnTupleValue();
TupleValue newTupleValue(String cqlDefinition);
}
Java UDF 已經為定義好的常見介面和類別進行一些匯入。這些匯入是
請注意,腳本 UDF 無法使用這些便利的匯入。
bc(sample).
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.cassandra.cql3.functions.UDFContext;
import com.datastax.driver.core.TypeCodec;
import com.datastax.driver.core.TupleValue;
import com.datastax.driver.core.UDTValue;
請參閱 CREATE FUNCTION
和 DROP FUNCTION
。
使用者定義的聚集
使用者定義的聚集允許使用 UDF 建立自訂的聚集函數。聚集函數的常見範例包括計數、最小值和最大值。
每個聚集都需要一個初始狀態(INITCOND
,預設為 null
)的類型為 STYPE
。狀態函數的第一個引數類型必須為 STYPE
。狀態函數的其餘引數必須與使用者定義的聚集引數類型相符。狀態函數會針對每一列呼叫一次,而狀態函數傳回的值會成為新的狀態。處理完所有列之後,會以最後的狀態值作為引數執行選用的 FINALFUNC
。
STYPE
是必要的,才能夠區分狀態和/或最終函數可能重載的版本(因為重載可能會在建立聚集之後出現)。
自訂聚合函數可用於 SELECT
陳述式。
自訂聚合函數的完整工作範例(假設已使用 USE
陳述式選取鍵空間)
bc(sample)..
CREATE OR REPLACE FUNCTION averageState ( state tuple<int,bigint>, val int )
CALLED ON NULL INPUT
RETURNS tuple<int,bigint>
LANGUAGE java
AS ’
if (val != null) \{
state.setInt(0, state.getInt(0)+1);
state.setLong(1, state.getLong(1)+val.intValue());
}
return state;
’;
CREATE OR REPLACE FUNCTION averageFinal ( state tuple<int,bigint> )
CALLED ON NULL INPUT
RETURNS double
LANGUAGE java
AS ’
double r = 0;
if (state.getInt(0) == 0) return null;
r = state.getLong(1);
r /= state.getInt(0);
return Double.valueOf®;
’;
CREATE OR REPLACE AGGREGATE average ( int )
SFUNC averageState
STYPE tuple<int,bigint>
FINALFUNC averageFinal
INITCOND (0, 0);
CREATE TABLE atable (
pk int PRIMARY KEY,
val int);
INSERT INTO atable (pk, val) VALUES (1,1);
INSERT INTO atable (pk, val) VALUES (2,2);
INSERT INTO atable (pk, val) VALUES (3,3);
INSERT INTO atable (pk, val) VALUES (4,4);
SELECT average(val) FROM atable;
p.
請參閱 CREATE AGGREGATE
和 DROP AGGREGATE
。
JSON 支援
Cassandra 2.2 為 SELECT
和 INSERT
陳述式新增 JSON 支援。此支援並未從根本上改變 CQL API(例如,架構仍受強制執行),它僅提供一個方便的方式來處理 JSON 文件。
SELECT JSON
對於 SELECT
陳述式,新的 JSON
關鍵字可用於將每一列傳回為單一 JSON
編碼的對應。其餘 SELECT
陳述式行為相同。
結果對應的鍵與一般結果集中的欄位名稱相同。例如,類似 SELECT JSON a, ttl(b) FROM …’' 的陳述式會產生一個對應,其鍵為 `"a"
和 "ttl(b)"
。不過,有一個值得注意的例外:為了與 INSERT JSON
行為對稱,大小寫敏感且包含大寫字母的欄位名稱會加上雙引號。例如,SELECT JSON myColumn FROM …’' 會產生一個對應鍵為 `"\"myColumn\""
(請注意跳脫的引號)。
對應值會是結果集值的 JSON
編碼表示(如下所述)。
INSERT JSON
使用 INSERT
陳述式,新的 JSON
關鍵字可用於啟用將 JSON
編碼的對應插入為單一行。JSON
對應的格式通常應與在同一張表上使用 SELECT JSON
陳述式所傳回的格式相符。特別是,區分大小寫的欄位名稱應加上雙引號。例如,若要插入至兩欄位名稱為 myKey'' 和
value'' 的表,您會執行下列動作
bc(sample).
INSERT INTO mytable JSON `\{\''myKey\
'': 0, ``value'': 0}'
任何從 JSON
對應中省略的欄位將預設為 NULL
值(這將導致建立墓碑)。
Cassandra 資料類型的 JSON 編碼
在可能的情況下,Cassandra 將以其原生 JSON
呈現方式呈現並接受資料類型。Cassandra 也將接受與所有單一欄位類型 CQL 文字格式相符的字串呈現方式。例如,浮點數、整數、UUID 和日期可以用 CQL 文字字串呈現。但是,複合類型(例如集合、組和使用者定義的類型)必須以原生 JSON
集合(對應和清單)或集合的 JSON 編碼字串呈現方式呈現。
下表說明 Cassandra 將在 INSERT JSON
值(和 from_json()
參數)中接受的編碼,以及 Cassandra 在傳回 SELECT JSON
陳述式(和 from_json()
)的資料時將使用的格式
類型 | 可接受的格式 | 傳回格式 | 註解 |
---|---|---|---|
|
字串 |
字串 |
使用 JSON 的 |
|
整數、字串 |
整數 |
字串必須是有效的 64 位元整數 |
|
字串 |
字串 |
字串應為 0x 後接偶數個十六進位數字 |
|
布林、字串 |
布林 |
字串必須是 |
|
字串 |
字串 |
日期格式為 |
|
整數、浮點數、字串 |
float |
在用戶端解碼器中可能超過 32 或 64 位元 IEEE-754 浮點數精度 |
|
整數、浮點數、字串 |
float |
字串必須是有效的整數或浮點數 |
|
整數、浮點數、字串 |
float |
字串必須是有效的整數或浮點數 |
|
字串 |
字串 |
IPv4 或 IPv6 位址 |
|
整數、字串 |
整數 |
字串必須是有效的 32 位元整數 |
|
清單、字串 |
清單 |
使用 JSON 的原生清單呈現方式 |
|
對應、字串 |
對應 |
使用 JSON 的原生對應呈現方式 |
|
整數、字串 |
整數 |
字串必須是有效的 16 位元整數 |
|
清單、字串 |
清單 |
使用 JSON 的原生清單呈現方式 |
|
字串 |
字串 |
使用 JSON 的 |
|
字串 |
字串 |
格式為 |
|
整數、字串 |
字串 |
時間戳記。字串常數允許輸入時間戳記作為日期,請參閱下方的 使用日期 以取得更多資訊。會傳回格式為 |
|
字串 |
字串 |
類型 1 UUID。請參閱 常數 以取得 UUID 格式 |
|
整數、字串 |
整數 |
字串必須是有效的 8 位元整數 |
|
清單、字串 |
清單 |
使用 JSON 的原生清單呈現方式 |
|
對應、字串 |
對應 |
使用 JSON 的原生映射表示,其中欄位名稱為金鑰 |
|
字串 |
字串 |
請參閱 常數 以取得 UUID 格式 |
|
字串 |
字串 |
使用 JSON 的 |
|
整數、字串 |
整數 |
變動長度;可能會溢位 32 或 64 位元整數在用戶端解碼器 |
附錄 A:CQL 關鍵字
CQL 區分保留和未保留關鍵字。保留關鍵字不能用作識別碼,它們是真正保留給語言(但可以將保留關鍵字用雙引號括起來,以將其用作識別碼)。然而,未保留關鍵字只在特定情況下具有特定含義,但否則可以用作識別碼。這些未保留關鍵字唯一的存在理由是方便:有些關鍵字在解析器是否將其用作關鍵字時,總是很容易判斷的,因此它們未保留。
關鍵字 | 保留? |
---|---|
|
是 |
|
否 |
|
否 |
|
是 |
|
是 |
|
是 |
|
是 |
|
否 |
|
是 |
|
否 |
|
是 |
|
是 |
|
是 |
|
否 |
|
否 |
|
否 |
|
是 |
|
否 |
|
否 |
|
否 |
|
是 |
|
否 |
|
否 |
|
否 |
|
否 |
|
是 |
|
否 |
|
否 |
|
否 |
|
是 |
|
是 |
|
是 |
|
是 |
|
否 |
|
否 |
|
是 |
|
否 |
|
是 |
|
是 |
|
否 |
|
否 |
|
否 |
|
否 |
|
是 |
|
否 |
|
是 |
|
否 |
|
否 |
|
是 |
|
否 |
|
是 |
|
是 |
|
是 |
|
否 |
|
是 |
|
否 |
|
否 |
|
是 |
|
否 |
|
是 |
|
是 |
|
否 |
|
否 |
|
否 |
|
是 |
|
否 |
|
否 |
|
否 |
|
是 |
|
否 |
|
否 |
|
否 |
|
否 |
|
是 |
|
是 |
|
是 |
|
是 |
|
是 |
|
否 |
|
是 |
|
否 |
|
是 |
|
是 |
|
是 |
|
是 |
|
否 |
|
是 |
|
是 |
|
否 |
|
否 |
|
否 |
|
否 |
|
否 |
|
是 |
|
是 |
|
是 |
|
否 |
|
是 |
|
否 |
|
否 |
|
是 |
|
是 |
|
否 |
|
是 |
|
否 |
|
否 |
|
否 |
|
否 |
|
否 |
|
否 |
|
是 |
|
否 |
|
否 |
|
否 |
|
否 |
|
否 |
|
是 |
|
是 |
|
否 |
|
是 |
|
否 |
|
否 |
|
否 |
|
是 |
|
否 |
|
是 |
|
是 |
|
是 |
|
否 |
|
否 |
|
是 |
|
否 |
|
否 |
|
否 |
|
否 |
|
是 |
|
是 |
|
是 |
|
否 |
變更
以下說明 CQL 各版本的變更。
3.4.3
-
支援
GROUP BY
。請參閱<group-by>
(請參閱 CASSANDRA-10707)。
3.4.2
-
支援選取集合的元素和切片(CASSANDRA-7396)。
3.4.2
-
INSERT/UPDATE 選項
對於有 default_time_to_live 指定生存時間為 0 的表格,將從插入或更新的值中移除生存時間 -
ALTER TABLE
ADD
和DROP
現在允許多個欄位新增/移除 -
新的
PER PARTITION LIMIT
選項(請參閱 CASSANDRA-7017)。 -
使用者定義函數 現在可透過新的
UDFContext
介面實例化UDTValue
和TupleValue
實例(請參閱 CASSANDRA-10818)。 -
`使用者定義類型''#createTypeStmt 現在可以儲存在非凍結形式中,允許在 `UPDATE`
陳述式 和DELETE
陳述式 中分別更新和刪除個別欄位。(CASSANDRA-7423
3.4.1
-
新增
CAST
函數。請參閱Cast
。
3.3.0
-
新增 聚合
-
使用者定義函數現在透過
CREATE FUNCTION
和DROP FUNCTION
提供支援。 -
使用者定義聚合現在透過
CREATE AGGREGATE
和DROP AGGREGATE
提供支援。 -
允許使用雙美元符號括起來的字串文字,作為單引號括起來的字串的替代方案。
-
引入角色來取代基於使用者的驗證和存取控制
-
已新增
JSON
支援 -
已新增
Tinyint
和Smallint
資料類型 -
新增新的時間轉換函數,並棄用
dateOf
和unixTimestampOf
。請參閱時間轉換函數
。
3.2.0
-
使用者定義類型現在透過
CREATE TYPE
、ALTER TYPE
和DROP TYPE
提供支援。 -
CREATE INDEX
現在支援索引集合欄位,包括透過keys()
函數索引映射集合的鍵 -
可以使用新的
CONTAINS
和CONTAINS KEY
營運子查詢集合上的索引 -
新增元組類型來存放固定長度的類型化位置欄位集合(請參閱 類型 區段)
-
DROP INDEX
現在支援選擇性地指定鍵空間
3.1.7
-
SELECT
陳述式現在支援使用組合式群集欄位中的IN
子句,在單一分區中選取多列。請參閱 SELECT WHERE 子句。 -
IF NOT EXISTS
和IF EXISTS
語法現在分別由CREATE USER
和DROP USER
陳述式支援。
3.1.6
-
已新增一個新的
uuid
方法。 -
支援
DELETE … IF EXISTS
語法。
3.1.5
-
現在可以在關聯中分組群集欄位,請參閱 SELECT WHERE 子句。
-
已新增對
STATIC
欄位的支援,請參閱 CREATE TABLE 中的 static。
3.1.4
-
CREATE INDEX
現在允許在建立自訂索引時指定選項(請參閱 CREATE INDEX 參考)。
3.1.3
-
已將毫秒精確度格式新增至時間戳記剖析器(請參閱 使用日期)。
3.1.2
-
已將
NaN
和Infinity
新增為有效的浮點常數。它們現在是保留關鍵字。在不太可能的情況下,如果您將它們用作欄位識別碼(或鍵空間/表格之一),現在您需要對它們加上雙引號(請參閱 引號識別碼)。
3.1.1
-
SELECT
陳述式現在允許列出分區金鑰(使用DISTINCT
修飾詞)。請參閱 CASSANDRA-4536。 -
現在在
WHERE
子句中支援c IN ?
語法。在這種情況下,繫結變數預期的值將是c
類型的清單。 -
現在可以使用命名繫結變數(使用
:name
代替?
)。
3.1.0
-
ALTER TABLE
DROP
選項已重新啟用 CQL3 表格,並且現在具有新的語意:已刪除欄位以前使用的空間現在將最終回收(壓縮後)。除非您使用具有微秒精確度的時間戳記,否則不應重新新增先前刪除的欄位(有關更多詳細資訊,請參閱 CASSANDRA-3919)。 -
SELECT
陳述式現在支援選取子句中的別名。不支援 WHERE 和 ORDER BY 子句中的別名。有關詳細資訊,請參閱 選取區段。 -
KEYSPACE
、TABLE
和INDEX
的CREATE
陳述式現在支援IF NOT EXISTS
條件。類似地,DROP
陳述式支援IF EXISTS
條件。 -
INSERT
陳述式選擇性地支援IF NOT EXISTS
條件,而UPDATE
支援IF
條件。
3.0.5
-
SELECT
、UPDATE
和DELETE
陳述式現在允許空的IN
關係(請參閱 CASSANDRA-5626)。
3.0.3
-
已新增對自訂 次要索引 的支援。
3.0.2
-
已修正 常數 的類型驗證。例如,實作過去允許
'2'
作為int
欄位的有效值(將其解釋為2
的等效值),或42
作為有效的blob
值(在此情況下,42
被解釋為 blob 的十六進位表示)。現在不再如此,常數的類型驗證現在更加嚴格。有關哪種類型允許哪個常數的詳細資訊,請參閱 資料類型 區段。 -
前一點的類型驗證修正已導致引入 blob 常數 以允許輸入 blob。請注意,雖然此版本仍支援將 blob 作為字串常數輸入(以允許更順利地轉換為 blob 常數),但現在已棄用(特別是 資料類型 區段未將字串常數列為有效的 blob),且將在未來版本中移除。如果您使用字串作為 blob,則應盡快更新您的用戶端程式碼以切換 blob 常數。
-
也已引入許多將原生類型轉換為 blob 的函式。此外,現在在選取子句中也允許使用 token 函式。有關詳細資訊,請參閱 函式區段 。
3.0.1
-
不再接受 日期字串(和時間戳記)作為有效的
timeuuid
值。這樣做是一個錯誤,因為日期字串不是有效的timeuuid
,因此會導致 令人困惑的行為。但是,已新增下列新方法來協助處理timeuuid
:now
、minTimeuuid
、maxTimeuuid
、dateOf
和unixTimestampOf
。有關更多詳細資訊,請參閱 專門針對這些方法的區段 。 -
`浮點常數''#constants 現在支援指數表示法。換句話說,`4.2E10
現在是有效的浮點值。
版本控制
CQL 語言的版本控制遵守 語意化版本控制 指南。版本採用 X.Y.Z 格式,其中 X、Y 和 Z 是分別代表主要、次要和修補層級的整數值。Cassandra 發行版本與 CQL 語言版本之間沒有關聯性。
版本 | 說明 |
---|---|
主要 |
當引入向後不相容的變更時,必須升級主要版本。這應該很少發生。 |
次要 |
當引入新的,但向後相容的功能時,會增加次要版本。 |
修補程式 |
當修正錯誤時,會增加修補程式版本。 |