Cassandra 文件

版本

您正在檢視預發行版本的說明文件。

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_]* 的代碼。

許多此類識別碼,例如 SELECTWITH,是 關鍵字。它們對語言具有固定的意義,且大多數是保留的。這些關鍵字的清單可以在 附錄 A 中找到。

識別碼和 (未加引號的) 關鍵字不區分大小寫。因此,SELECTselectsElEcT 相同,而 myIdmyidMYID 相同,例如。一個經常使用的慣例 (特別是此文件的範例) 是對關鍵字使用大寫,而對其他識別碼使用小寫。

有一種第二類型的識別碼稱為 加引號識別碼,定義為將任意字元序列置於雙引號 (") 中。加引號識別碼從來都不是關鍵字。因此,"select" 不是保留關鍵字,且可用於參照欄,而 select 會產生解析錯誤。此外,與未加引號的識別碼和關鍵字相反,加引號識別碼區分大小寫 ("My Quoted Id""my quoted id" 不同)。與 [a-zA-Z0-9_]* 相符的完全小寫加引號識別碼等於移除雙引號所取得的未加引號識別碼 (因此 "myid" 等於 myidmyId,但與 "myId" 不同)。在加引號識別碼內,雙引號字元可以重複以跳脫它,因此 "foo "" bar" 是有效的識別碼。

警告引號識別碼允許宣告具有任意名稱的欄位,而這些名稱有時會與伺服器使用的特定名稱衝突。例如,在使用條件更新時,伺服器會回應包含名為 "[applied]" 的特殊結果的結果集。如果您已宣告具有此名稱的欄位,這可能會混淆某些工具,應避免使用。一般而言,應優先使用未加引號的識別碼,但如果您使用引號識別碼,強烈建議避免使用方括號括住的任何名稱(例如 "[applied]")和任何看起來像函式呼叫的名稱(例如 "f(x)")。

常數

CQL 定義下列類型的常數:字串、整數、浮點數、布林值、UUID 和二進位大型物件

  • 字串常數是任意字元序列,並以單引號(')括住。您可以在字串中包含單引號,方法是重複它,例如 'It''s raining today'。這些不能與使用雙引號的引號識別碼混淆。

  • 整數常數定義為 '-'?[0-9]+

  • 浮點數常數定義為 '-'?[0-9]+('.'[0-9]*)?([eE][+-]?[0-9+])?。除此之外,NaNInfinity 也是浮點數常數。

  • 布林值常數為 truefalse,不分大小寫(即 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 驅動程式,不在本文檔的範圍內。

除了提供欄位值外,繫結標記可用於提供 LIMITTIMESTAMPTTL 子句的值。如果使用匿名繫結標記,則查詢參數的名稱分別為 [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 支援的 <屬性>

名稱 種類 強制 預設值 說明

複製

對應

要使用的鍵空間複製策略和選項。

durable_writes

簡單

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 TABLE
聲明會建立新表格。每個此類表格都是一組 (通常代表相關實體),它會為這些列定義多項屬性。表格由 名稱 定義,它會定義組成表格列的欄位,並有多項 選項。請注意,CREATE 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>

選項 種類 預設值 說明

註解

簡單

自由格式、人類可讀的註解。

gc_grace_seconds

簡單

864000

在回收垃圾收集墓碑(刪除標記)之前等待的時間。

bloom_filter_fp_chance

簡單

0.00075

sstable 布隆過濾器的假陽性目標機率。所述布隆過濾器的大小將調整為提供所提供的機率(因此降低此值會影響布隆過濾器在記憶體和磁碟中的大小)

default_time_to_live

簡單

0

表格的預設過期時間(``TTL''),單位為秒。

compaction

對應

請參閱下方

壓縮選項,請參閱下方

compression

對應

請參閱下方

壓縮選項,請參閱下方

caching

對應

請參閱下方

快取選項,請參閱下方

crc_check_chance

簡單

1.0

此選項定義在讀取期間應檢查雜湊總和的機率,以偵測位元腐敗並防止毀損傳播到其他複本。預設值為 1,表示每次讀取資料區塊時都會套用雜湊總和。設定為 0 以停用雜湊總和檢查,例如設定為 0.5 以檢查每次讀取。

由於技術限制,我們目前僅將其套用於壓縮檔案。如果表格未啟用壓縮,則不會驗證任何雜湊總和。

壓縮選項

compaction 屬性至少必須定義 'class' 子選項,該子選項定義要使用的壓縮策略類別。預設支援的類別為 'SizeTieredCompactionStrategy''LeveledCompactionStrategy''TimeWindowCompactionStrategy'。可以透過指定完整類別名稱作為字串常數來提供自訂策略。其餘子選項取決於所選的類別。預設類別支援的子選項為

選項 支援的壓縮策略 預設值 說明

已啟用

全部

true

布林值,表示是否應啟用壓縮。

tombstone_threshold

全部

0.2

一個比率,如果 sstable 的可垃圾回收墓碑比率超過所有包含欄位的此比率,則 sstable 將被壓縮(沒有其他 sstable),以清除這些墓碑。

tombstone_compaction_interval

全部

1 天

在考慮 sstable 建立時間後,在考慮 墓碑壓縮'',其中 墓碑壓縮'' 是在 sstable 的可垃圾回收墓碑多於 tombstone_threshold 時觸發的壓縮之前,等待的最小時間。

unchecked_tombstone_compaction

全部

false

將此設定為 true 會啟用更積極的墓碑壓縮 - 單一 sstable 墓碑壓縮將在不檢查其成功機率的情況下執行。

min_sstable_size

SizeTieredCompactionStrategy

50MB

大小分層策略將 SSTable 分組到儲存區中進行壓縮。儲存區會將大小差異小於 50% 的 SSTable 分組。不過,對於較小的尺寸,這會導致分組過於細緻。min_sstable_size 定義一個大小閾值(以位元組為單位),低於此閾值的所有 SSTable 都屬於一個唯一的儲存區

min_threshold

SizeTieredCompactionStrategy

4

啟動次要壓縮所需的最小 SSTable 數量。

max_threshold

SizeTieredCompactionStrategy

32

由一次次要壓縮處理的最大 SSTable 數量。

bucket_low

SizeTieredCompactionStrategy

0.5

如果大小在 [average_size * bucket_low, average_size * bucket_high ] 範圍內,大小分層會將 sstable 視為在同一個儲存區中(即預設會將大小差異最多 50% 的 sstable 分組)

bucket_high

SizeTieredCompactionStrategy

1.5

如果大小在 [average_size * bucket_low, average_size * bucket_high ] 範圍內,大小分層會將 sstable 視為在同一個儲存區中(即預設會將大小差異最多 50% 的 sstable 分組)。

sstable_size_in_mb

LeveledCompactionStrategy

5MB

分層策略中 sstable 的目標大小(以 MB 為單位)。請注意,雖然 sstable 大小應保持小於或等於 sstable_size_in_mb,但可能會例外地出現較大的 sstable,因為在壓縮期間,給定分區金鑰的資料絕不會拆分為 2 個 sstable

timestamp_resolution

TimeWindowCompactionStrategy

MICROSECONDS

插入資料時使用的時間戳解析度,可以是 MILLISECONDS、MICROSECONDS 等(Java TimeUnit 應可理解) - 除非您使用 USING TIMESTAMP(或直接在客戶端中使用等效的指令)進行突變,否則請勿變更此設定

compaction_window_unit

TimeWindowCompactionStrategy

DAYS

compaction_window_size 連用設定的視窗大小所使用的 Java TimeUnit。必須是 DAYS、HOURS、MINUTES 之一

compaction_window_size

TimeWindowCompactionStrategy

1

組成時間視窗的 compaction_window_unit 單位數。

unsafe_aggressive_sstable_expiration

TimeWindowCompactionStrategy

false

過期的 sstable 將會被刪除,而不會檢查其資料是否會遮蔽其他 sstable。這是一個潛在的風險選項,可能會導致資料遺失或已刪除的資料重新出現,超越 unchecked_tombstone_compaction 對單一 sstable 壓縮所執行的動作。由於風險的關係,jvm 也必須以 -Dcassandra.unsafe_aggressive_sstable_expiration=true 啟動。

壓縮選項

對於 compression 屬性,有以下子選項可用

選項 預設值 說明

class

LZ4Compressor

要使用的壓縮演算法。預設壓縮器為:LZ4Compressor、SnappyCompressor 和 DeflateCompressor。使用 'enabled' : false 來停用壓縮。可以透過指定完整類別名稱作為 字串常數 來提供自訂壓縮器。

已啟用

true

預設情況下會啟用壓縮。若要停用,請將 enabled 設定為 false

chunk_length_in_kb

64KB

磁碟上的 SSTables 會依區塊壓縮(允許隨機讀取)。這會定義所述區塊的大小(以 KB 為單位)。較大的值可能會改善壓縮率,但會增加從磁碟讀取資料的最小大小,以進行讀取

快取選項

對於 caching 屬性,可以使用下列子選項

選項 預設值 說明

keys

ALL

是否要快取這個資料表的鍵(`key cache'')。有效值為:`ALL` 和 `NONE`。

rows_per_partition

NONE

每個分割區要快取的列數(`row cache'')。如果指定整數 `n`,則會快取分割區中查詢到的前 `n` 列。其他可能的選項包括 `ALL`,以快取查詢到的分割區中的所有列,或 `NONE` 以停用列快取。

其他考量
  • 插入 / 更新特定列時,不需要定義所有欄位(鍵的一部分除外),而遺失的欄位在磁碟上不佔用任何空間。此外,新增新欄位(請參閱 ALTER TABLE)是一個常數時間作業。因此,在建立資料表時,不需要嘗試預期未來使用情況(或在沒有預期到時感到遺憾)。

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(語法)。::= 刪除物化檢視 (如果存在)?

範例

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 會建立或取代使用者定義的函數。

函數簽章

簽章用於區分個別函數。簽章包含

  1. 完全限定的函數名稱 - 即 keyspace 加上 function-name

  2. 所有引數類型的串接清單

請注意,keyspace 名稱、函數名稱和引數類型會受到預設命名慣例和大寫/小寫敏感規則的約束。

具有選用 OR REPLACE 關鍵字的 CREATE FUNCTION 會建立函數或以具有相同簽章的現有函數取代它。如果已存在具有相同簽章的函數,則沒有 OR REPLACECREATE FUNCTION 會失敗。

必須為每個函數定義使用 null 值呼叫時的行為。有兩個選項

  1. RETURNS NULL ON NULL INPUT 宣告如果任何輸入引數為 null,函數將永遠傳回 null

  2. CALLED ON NULL INPUT 宣告函數將永遠執行。

如果使用了選用的 IF NOT EXISTS 關鍵字,則只有在具有相同簽章的其他函數不存在時,函數才會建立。

OR REPLACEIF 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 REPLACECREATE AGGREGATE 會失敗。

包含選用 IF NOT EXISTS 關鍵字的 CREATE AGGREGATE 會在聚合不存在時建立聚合。

OR REPLACEIF NOT EXIST 無法同時使用。

聚合屬於鍵空間。如果未在 <aggregate-name> 中指定鍵空間,則使用目前的鍵空間(即使用 USE 陳述式指定的鍵空間)。無法在其中一個系統鍵空間中建立使用者定義聚合。

使用者定義聚合的簽章遵循與使用者定義函數 相同的規則

STYPE 定義狀態值的類型,且必須指定。

選用的 INITCOND 定義聚合的初始狀態值。預設為 null。對於宣告為 RETURNS NULL ON NULL INPUT 的狀態函數,必須指定非 nullINITCOND

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 \{movie'': Serenity'', director'': Joss Whedon'', ``year'': 2005}'
p.
插入 NerdMovies 中。`INSERT` 陳述式會為資料表中特定列寫入一個或多個欄位。請注意,由於列是由其 PRIMARY KEY 識別,因此至少必須指定組成該列的欄位。使用 VALUES 語法時,必須提供要插入的欄位清單。使用 JSON 語法時,它們是選用的。有關更多詳細資料,請參閱 INSERT JSON 區段。

請注意,與 SQL 不同,INSERT 預設不會檢查列的先前存在性:如果之前不存在列,則會建立列;否則,會更新列。此外,沒有辦法知道發生建立或更新的哪一個動作。

然而,可以使用 IF NOT EXISTS 條件,僅在插入之前不存在列時才插入。但請注意,使用 IF NOT EXISTS 會產生不可忽略的效能成本(內部會使用 Paxos),因此應該謹慎使用。

INSERT 的所有更新都會以原子方式和隔離方式套用。

有關可用的 <option> 資訊,請參閱 UPDATE 區段;有關 <collection-literal> 的使用方式,請參閱 集合 區段。另請注意,INSERT 不支援計數器,但 UPDATE 支援。

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';
p.
`UPDATE` 陳述式會為資料表中特定列寫入一個或多個欄位。<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> 形式用於設定非凍結使用者定義類型上單一欄位的數值。

<options>

UPDATEINSERT 陳述式支援下列選項

  • TIMESTAMP:設定作業的時間戳記。如果未指定,協調器會使用陳述式執行開始時目前的微秒時間作為時間戳記。這通常是適當的預設值。

  • TTL:指定插入值的選擇性生存時間(以秒為單位)。如果設定,插入的值會在指定時間後自動從資料庫中移除。請注意,TTL 涉及插入的值,而不是欄位本身。這表示欄位的任何後續更新也會重設 TTL(重設為該更新中指定的任何 TTL)。預設值為值永不過期。TTL 為 0 等於沒有 TTL。如果表格有 default_time_to_live,TTL 為 0 會移除插入或更新值的 TTL。

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 子句進行條件設定,類似於 UPDATEINSERT 敘述。不過,與 INSERTUPDATE 敘述一樣,這會產生不可忽略的效能成本(在內部,會使用 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 敘述會將多個修改敘述(插入/更新和刪除)群組成一個單一敘述。它有幾個目的

  1. 在批次處理多個更新時,它會節省用戶端和伺服器(有時是伺服器協調器和複製品)之間的網路往返。

  2. 屬於特定分割鍵的 BATCH 中的所有更新會獨立執行。

  3. 預設情況下,批次中的所有作業都會執行為 LOGGED,以確保所有變更最終完成(或都不會完成)。請參閱 UNLOGGED 的注意事項以取得更多詳細資料。

請注意

  • BATCH 敘述只能包含 UPDATEINSERTDELETE 敘述。

  • 批次並非 SQL 交易的完整類比。

  • 如果未為每個作業指定時間戳記,則所有作業都將套用相同時間戳記。由於 Cassandra 在 時間戳記相等 的情況下會進行衝突解決程序,因此作業的套用順序可能與 BATCH 陳述式中所列的順序不同。若要強制執行特定的作業順序,您必須指定每個作業的時間戳記。

UNLOGGED

預設情況下,Cassandra 會使用批次記錄檔確保批次中的所有作業最終完成,否則都不會完成(但請注意,作業僅在單一分割區中隔離)。

當批次跨越多個分割區時,批次原子性會產生效能損失。如果您不希望產生此損失,您可以使用 UNLOGGED 選項告知 Cassandra 略過批次記錄檔。如果使用 UNLOGGED 選項,失敗的批次可能會導致修補程式僅部分套用。

COUNTER

使用 COUNTER 選項進行批次計數器更新。與 Cassandra 中的其他更新不同,計數器更新不是冪等的。

<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> 相同,並說明於 函數區段 中。除了這些一般函數之外,WRITETIMEMAXWRITETIME (resp. TTL) 函數允許選取欄位插入的時間戳記 (resp. 欄位的生存時間 (以秒為單位) (或如果欄位沒有設定到期日,則為 null)),而 CAST 函數可用於將一種資料類型轉換為另一種資料類型。WRITETIMETTL 函數無法用於多單元格欄位,例如非凍結集合或非凍結使用者定義類型。

此外,可以使用 [ <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_tile2012-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 的陳述中,選取一欄位而沒有聚合函數,則會回傳每個群組中遇到的第一個值。

LIMITPER 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 中的角色管理是可插入的,自訂實作可能只支援列出的選項的一部分。

如果角色名稱包含非字母數字字元,則應加上引號。

設定內部驗證的認證資料

使用 WITH PASSWORD 子句設定內部驗證的密碼,並將密碼用單引號括起來。
如果尚未設定內部驗證或角色沒有 LOGIN 權限,則不需要 WITH PASSWORD 子句。

有條件地建立角色

嘗試建立現有角色會導致無效的查詢條件,除非使用 IF NOT EXISTS 選項。如果使用該選項且角色存在,則該陳述式為 no-op。

bc(sample).
建立角色 other_role;
建立角色 other_role,如果不存在;

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 角色取得的任何權限也會被撤銷。

LIST ROLES

語法

bc(syntax).
::= LIST ROLES ( OF )? ( NORECURSIVE )?

範例

bc(sample).
LIST ROLES;

傳回系統中所有已知角色,這需要資料庫角色資源的 DESCRIBE 權限。

bc(sample).
LIST ROLES OF alice;

列舉授與 alice 的所有角色,包括傳遞取得的角色。

bc(sample).
LIST ROLES OF bob NORECURSIVE

列出直接授與 bob 的所有角色。

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.

變更使用者

語法

bc(syntax)..
::= 變更使用者 (如果存在)? (使用密碼)? ( )?

::= SUPERUSER
| NOSUPERUSER
p.

bc(sample).
變更使用者 alice 密碼為 `PASSWORD_A`;
變更使用者 bob SUPERUSER;

如果使用者不存在,陳述式將傳回錯誤,除非使用 如果存在,在這種情況下,操作為無操作。

刪除使用者

語法

bc(syntax)..
::= 刪除使用者 (如果存在)?
p.

範例

bc(sample).
刪除使用者 alice;
刪除使用者 bob 如果存在;

列出使用者

語法

bc(syntax).
::= 列出使用者;

範例

bc(sample).
列出使用者;

此陳述式等同於

bc(sample).
LIST ROLES;

但只有具有 登入 權限的角色會包含在輸出中。

資料庫身分

新增身分

語法

bc(syntax)..
::= 新增身分 (如果不存在)? 至角色 ?

範例

bc(sample).
新增身分 'id1' 至角色 'role1';

只有具有新增角色權限的使用者才能新增身分

如果角色名稱和身分名稱包含非字母數字字元,則應加上引號。

有條件地新增身分

嘗試新增現有身分會導致無效的查詢條件,除非使用 如果不存在 選項。如果使用此選項且身分存在,則陳述式為無操作。

bc(sample).
如果角色「role1」中不存在身分識別碼「id1」,請新增。

刪除身分識別碼

語法

bc(syntax)..
::= DROP IDENTITY ( IF EXISTS )?
p.

範例

bc(sample).
刪除身分識別碼「testIdentity」。
如果身分識別碼「testIdentity」存在,請刪除。

只有擁有刪除角色權限的使用者才能移除身分識別碼

嘗試刪除不存在的身分識別碼會導致無效的查詢條件,除非使用 IF EXISTS 選項。如果使用此選項且身分識別碼不存在,則此陳述式為無作用。

資料控制

權限

資源上的權限授予角色;Cassandra 中有數種不同類型的資源,且每種類型都以階層方式建模

  • 資料資源、鍵空間和資料表的階層結構為 ALL KEYSPACESKEYSPACETABLE

  • 函數資源的結構為 ALL FUNCTIONSKEYSPACEFUNCTION

  • 代表角色的資源結構為 ALL ROLESROLE

  • 代表 JMX ObjectNames(對應到 MBeans/MXBeans 組合)的資源結構為 ALL MBEANSMBEAN

可以在這些階層的任何層級授予權限,且權限會向下傳遞。因此,在鏈中的較高層級資源上授予權限會自動在較低層級的所有資源上授予相同的權限。例如,在 KEYSPACE 上授予 SELECT 權限會自動在該 KEYSPACE 中的所有 TABLES 上授予 SELECT 權限。同樣地,在 ALL FUNCTIONS 上授予權限會在每個已定義的函數上授予權限,無論其作用範圍在於哪個鍵空間。也可以在特定鍵空間的作用範圍內授予所有函數權限。

現有客戶端工作階段可見權限修改;換句話說,在權限變更後不需要重新建立連線。

可用的完整權限組為

  • 建立

  • 變更

  • 刪除

  • 選擇

  • 修改

  • 授權

  • 描述

  • 執行

  • 取消遮罩

  • 選擇遮罩

並非所有權限都適用於每種類型的資源。例如,EXECUTE 僅與函數或 mbean 相關;授予 EXECUTE 在表示表格的資源上是沒有意義的。嘗試對無法套用的資源GRANT 權限會導致錯誤回應。以下說明哪些權限可以授予哪些類型的資源,以及哪些陳述是由該權限啟用的。

權限 資源 操作

建立

所有鍵空間

CREATE KEYSPACE <br> 在任何鍵空間中建立 CREATE TABLE

建立

鍵空間

在指定的鍵空間中建立 CREATE TABLE

建立

所有函數

在任何鍵空間中建立 CREATE FUNCTION <br> 在任何鍵空間中建立 CREATE AGGREGATE

建立

鍵空間中的所有函數

在鍵空間中建立 CREATE FUNCTION <br> 在鍵空間中建立 CREATE AGGREGATE

建立

所有角色

建立角色

變更

所有鍵空間

ALTER KEYSPACE <br> 在任何鍵空間中 ALTER TABLE

變更

鍵空間

ALTER KEYSPACE <br> 在鍵空間中 ALTER TABLE

變更

表格

ALTER TABLE

變更

所有函數

建立 CREATE FUNCTION 取代任何現有的 <br> 建立 CREATE AGGREGATE 取代任何現有的

變更

鍵空間中的所有函數

建立 CREATE FUNCTION 取代鍵空間中現有的 <br> 建立 CREATE AGGREGATE 取代鍵空間中現有的

變更

函數

建立 CREATE FUNCTION 取代現有的 <br> 建立 CREATE AGGREGATE 取代現有的

變更

所有角色

在任何角色上 ALTER ROLE

變更

角色

變更角色

刪除

所有鍵空間

DROP KEYSPACE <br> 在任何鍵空間中 DROP TABLE

刪除

鍵空間

在指定的鍵空間中 DROP TABLE

刪除

表格

DROP TABLE

刪除

所有函數

在任何鍵空間中 DROP FUNCTION <br> 在任何現有的 DROP AGGREGATE

刪除

鍵空間中的所有函數

在鍵空間中 DROP FUNCTION <br> 在現有的 DROP AGGREGATE

刪除

函數

刪除函數

刪除

所有角色

在任何角色上 DROP ROLE

刪除

角色

刪除角色

選擇

所有鍵空間

在任何表格上 SELECT

選擇

鍵空間

在鍵空間中的任何表格上 SELECT

選擇

表格

在指定的表格上 SELECT

選擇

所有 MBEAN

在任何 mbean 上呼叫 getter 方法

選擇

MBEAN

在任何與萬用字元模式相符的 mbean 上呼叫 getter 方法

選擇

MBEAN

在指定的 mbean 上呼叫 getter 方法

修改

所有鍵空間

在任何表格上 INSERT <br> 在任何表格上 UPDATE <br> 在任何表格上 DELETE <br> 在任何表格上 TRUNCATE

修改

鍵空間

在鍵空間中的任何表格上 INSERT <br> 在鍵空間中的任何表格上 UPDATE <br> 在鍵空間中的任何表格上 DELETE <br> 在鍵空間中的任何表格上 TRUNCATE

修改

表格

INSERT <br> UPDATE <br> DELETE <br> TRUNCATE

修改

所有 MBEAN

在任何 mbean 上呼叫 setter 方法

修改

MBEAN

呼叫與萬用字元模式相符的任何 mbean 上的 setter 方法

修改

MBEAN

呼叫命名 mbean 上的 setter 方法

授權

所有鍵空間

GRANT PERMISSION 針對任何表格 <br> REVOKE PERMISSION 針對任何表格

授權

鍵空間

GRANT PERMISSION 針對鍵空間中的表格 <br> REVOKE PERMISSION 針對鍵空間中的表格

授權

表格

GRANT PERMISSION <br> REVOKE PERMISSION

授權

所有函數

GRANT PERMISSION 針對任何函數 <br> REVOKE PERMISSION 針對任何函數

授權

鍵空間中的所有函數

GRANT PERMISSION 在鍵空間中 <br> REVOKE PERMISSION 在鍵空間中

授權

鍵空間中的所有函數

GRANT PERMISSION 在鍵空間中 <br> REVOKE PERMISSION 在鍵空間中

授權

函數

GRANT PERMISSION <br> REVOKE PERMISSION

授權

所有 MBEAN

GRANT PERMISSION 針對任何 mbean <br> REVOKE PERMISSION 針對任何 mbean

授權

MBEAN

GRANT PERMISSION 針對與萬用字元模式相符的任何 mbean <br> REVOKE PERMISSION 針對與萬用字元模式相符的任何 mbean

授權

MBEAN

GRANT PERMISSION 針對命名 mbean <br> REVOKE PERMISSION 針對命名 mbean

授權

所有角色

GRANT ROLE 授予任何角色 <br> REVOKE ROLE 撤銷任何角色

授權

角色

GRANT ROLE 授予角色 <br> REVOKE ROLE 撤銷角色

描述

所有角色

LIST ROLES 所有角色或僅授予另一個指定角色的角色

描述

@ALL MBEANS

從平台的 MBeanServer 擷取任何 mbean 的元資料

描述

@MBEANS

從平台的 MBeanServer 擷取與萬用字元模式相符的任何 mbean 的元資料

描述

@MBEAN

從平台的 MBeanServer 擷取命名 mbean 的元資料

執行

所有函數

SELECTINSERTUPDATE 使用任何函數 <br> 在 CREATE AGGREGATE 中使用任何函數

執行

鍵空間中的所有函數

SELECTINSERTUPDATE 使用鍵空間中的任何函數 <br> 在 CREATE AGGREGATE 中使用鍵空間中的任何函數

執行

函數

SELECTINSERTUPDATE 使用函數 <br> 在 CREATE AGGREGATE 中使用函數

執行

所有 MBEAN

對任何 mbean 執行作業

執行

MBEAN

對與萬用字元模式相符的任何 mbean 執行作業

執行

MBEAN

對命名 mbean 執行作業

取消遮罩

所有鍵空間

查看任何表格上遮罩欄位的明確內容

取消遮罩

鍵空間

查看鍵空間中任何表格上遮罩欄位的明確內容

取消遮罩

表格

查看指定表格上遮罩欄位的明確內容

選擇遮罩

所有鍵空間

SELECT 限制任何表格上的遮罩欄位

選擇遮罩

鍵空間

SELECT 限制指定鍵空間中任何表格上的遮罩欄位

選擇遮罩

表格

SELECT 限制指定表格上的遮罩欄位

授予權限

語法

bc(syntax)..
::= 授予 ( 所有 ( 權限 )? | ( 權限 )? ) 給

::= 建立 | 變更 | 刪除 | 選取 | 修改 | 授權 | 描述 | 取消遮罩 | 選取遮罩執行

::= 所有鍵空間
| 鍵空間
| ( 表格 )?
| 所有角色
| 角色
| 所有函數 ( 在鍵空間中 )?
| 函數
| 所有 MBean
| ( MBean | MBean )
p.

範例

bc(sample).
授予 data_reader 所有鍵空間的 SELECT 權限;

這會讓具有 data_reader 角色的任何使用者都能對所有鍵空間中的任何表格執行 SELECT 陳述式

bc(sample).
授予 data_writer 鍵空間 keyspace1 的 MODIFY 權限;

這會讓具有 data_writer 角色的任何使用者都能對 keyspace1 鍵空間中的所有表格執行 UPDATEINSERTUPDATEDELETETRUNCATE 查詢

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 )SELECTINSERTUPDATE 查詢

bc(sample).
授予 role_admin 所有角色的 DESCRIBE 權限;

這會讓具有 role_admin 角色的任何使用者都能使用 LIST ROLES 陳述式檢視系統中的任何和所有角色

授予所有

使用 GRANT ALL 形式時,適當的權限集會根據目標資源自動確定。

自動授予

當透過 CREATE KEYSPACECREATE TABLECREATE FUNCTIONCREATE AGGREGATECREATE ROLE 陳述式建立資源時,建立者 (資料庫使用者身分識別的使用者角色) 會自動獲得新資源的所有適用權限。

撤銷權限

語法

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 上的所有權限;

顯示授予 bobkeyspace1.table1 上的所有權限,包括從任何其他角色傳遞取得的權限。這也包括資源階層中較高層級的任何權限,這些權限可以套用至 keyspace1.table1。例如,如果 bobkeyspace1 擁有 ALTER 權限,這將會包含在這個查詢的結果中。加入 NORECURSIVE 開關會將結果限制為僅授予 bobbob 的角色的權限。

bc(sample).
列出 carlos 的 SELECT 權限;

顯示授予 carloscarlos 的任何角色的任何權限,限於任何資源上的 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

字串

ASCII 字元字串

bigint

整數

64 位元有號長整數

blob

blob

任意位元組(無驗證)

布林

布林值

真或假

計數器

整數

計數器欄位(64 位元有號值)。有關詳細資訊,請參閱 計數器

date

整數、字串

日期(無對應時間值)。有關更多資訊,請參閱下方的 使用日期

十進位

整數、浮點數

變動精度十進位

double

整數

64 位元 IEEE-754 浮點數

float

整數、浮點數

32 位元 IEEE-754 浮點數

inet

字串

IP 位址。長度可以為 4 位元組(IPv4)或 16 位元組(IPv6)。沒有 inet 常數,IP 位址應輸入為字串

int

整數

32 位元有號整數

smallint

整數

16 位元有號整數

text

字串

UTF8 編碼字串

time

整數、字串

具有奈秒精度的時間。有關更多資訊,請參閱下方的 使用時間

timestamp

整數、字串

時間戳記。字串常數允許將時間戳記輸入為日期,有關更多資訊,請參閱下方的 使用時間戳記

timeuuid

uuids

類型 1 UUID。這通常用作「無衝突」時間戳記。另請參閱 Timeuuid 的函數

tinyint

整數

8 位元有號整數

uuid

uuids

類型 1 或類型 4 UUID

varchar

字串

UTF8 編碼字串

varint

整數

變動精度整數

有關如何使用集合類型的更多資訊,請參閱下方的 使用集合 部分。

使用時間戳記

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 會自動忽略將資料類型轉換為其自身資料類型的任何轉換。

來源 目標

ascii

textvarchar

bigint

tinyintsmallintintfloatdoubledecimalvarinttextvarchar

布林

textvarchar

計數器

tinyintsmallintintbigintfloatdoubledecimalvarinttextvarchar

date

timestamp

十進位

tinyintsmallintintbigintfloatdoublevarinttextvarchar

double

tinyintsmallintintbigintfloatdecimalvarinttextvarchar

float

tinyintsmallintintbigintdoubledecimalvarinttextvarchar

inet

textvarchar

int

tinyintsmallintbigintfloatdoubledecimalvarinttextvarchar

smallint

tinyintintbigintfloatdoubledecimalvarinttextvarchar

time

textvarchar

timestamp

datetextvarchar

timeuuid

timestampdatetextvarchar

tinyint

tinyintsmallintintbigintfloatdoubledecimalvarinttextvarchar

uuid

textvarchar

varint

tinyintsmallintintbigintfloatdoubledecimaltextvarchar

轉換嚴格依賴於 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

Uuid

uuid 函數不採用參數,並產生適用於 INSERT 或 SET 陳述式的隨機類型 4 uuid。

Timeuuid 函數

now

now 函數不採用參數,並在協調器節點上產生新的唯一 timeuuid(在使用它的陳述式執行的時間)。請注意,此方法對於插入很有用,但在 WHERE 子句中基本上沒有意義。例如,下述形式的查詢

bc(sample).
SELECT * FROM myTable WHERE t = now()

根據設計永遠不會回傳任何結果,因為 now() 回傳的值保證是唯一的。

min_timeuuidmax_timeuuid

min_timeuuid(或 max_timeuuid)函數會取得 timestampt(可以 是時間戳記或日期字串),並傳回一個對應於時間戳記 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_timeuuidmax_timeuuid 產生的值為 UUID,因為它們不符合 RFC 4122 所規定的時間基礎 UUID 產生程序。特別是,這兩個方法傳回的值不會是唯一的。這表示您應該只將這些方法用於查詢(如以上的範例)。插入這些方法的結果幾乎可以確定是一個壞主意

時間轉換函數

提供許多函數將 `timeuuid'' 轉換為 `timestamp 或 `date`,或 `date` 轉換為其他 `原生` 類型。

函數名稱 輸入類型 說明

to_date

timeuuid

timeuuid 參數轉換為 date 類型

to_date

timestamp

timestamp 參數轉換為 date 類型

to_timestamp

timeuuid

timeuuid 參數轉換為 timestamp 類型

to_timestamp

date

date 參數轉換為 timestamp 類型

to_unix_timestamp

timeuuid

timeuuid 參數轉換為 bigInt 原始值

to_unix_timestamp

timestamp

timestamp 參數轉換為 bigInt 原始值

to_unix_timestamp

date

date 參數轉換為 bigInt 原始值

Blob 轉換函數

提供許多函數將原生類型轉換為二進位資料(blob)。對於 CQL3 支援的每一個 <原生類型> 類型(顯著的例外是 blob,原因很明顯),type_as_blob 函數會取得 類型 類型的參數,並將其傳回為 blob。反之,blob_as_type 函數會取得 64 位元 blob 參數,並將其轉換為 bigint 值。因此,例如,bigint_as_blob(3)0x0000000000000003,而 blob_as_bigint(0x0000000000000003)3

聚合

聚合函數會對一組列進行運算。它們會接收每一列的值,並傳回整組的單一值。
如果 normal 欄位、scalar functionsUDT 欄位、writetimemaxwritetimettl 與聚合函數一起選取,則為它們傳回的值將為與查詢相符的第一列值。

CQL3 區分內建聚合(稱為「原生聚合」)和 使用者定義聚合。CQL3 包含數個原生聚合,如下所述

計數

count 函數可用於計數查詢傳回的列。範例

bc(sample).
SELECT COUNT (*) FROM plays;
SELECT COUNT (1) FROM plays;

它也可以用於計數指定欄位的非 Null 值。範例

bc(sample).
SELECT COUNT (scores) FROM plays;

最大值和最小值

maxmin 函數可用於計算查詢傳回的指定欄位的最大值和最小值。

bc(sample).
SELECT MIN (players), MAX (players) FROM plays WHERE game = `quake';

總和

sum 函數可用於將查詢傳回的指定欄位的全部值加總。

bc(sample).
SELECT SUM (players) FROM plays;

平均值

avg 函數可用於計算查詢傳回的指定欄位的全部值的平均值。

bc(sample).
SELECT AVG (players) FROM plays;

使用者定義函數

使用者定義函數允許在 Cassandra 中執行使用者提供的程式碼。預設情況下,Cassandra 支援以 JavaJavaScript 定義函數。在 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''); ;

使用者定義的函數可用於 SELECTINSERTUPDATE 陳述式。

隱含可用的 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 FUNCTIONDROP 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 AGGREGATEDROP AGGREGATE

JSON 支援

Cassandra 2.2 為 SELECTINSERT 陳述式新增 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())的資料時將使用的格式

類型 可接受的格式 傳回格式 註解

ascii

字串

字串

使用 JSON 的 \u 字元跳脫

bigint

整數、字串

整數

字串必須是有效的 64 位元整數

blob

字串

字串

字串應為 0x 後接偶數個十六進位數字

布林

布林、字串

布林

字串必須是 true'' 或 false''

date

字串

字串

日期格式為 YYYY-MM-DD,時區為 UTC

十進位

整數、浮點數、字串

float

在用戶端解碼器中可能超過 32 或 64 位元 IEEE-754 浮點數精度

double

整數、浮點數、字串

float

字串必須是有效的整數或浮點數

float

整數、浮點數、字串

float

字串必須是有效的整數或浮點數

inet

字串

字串

IPv4 或 IPv6 位址

int

整數、字串

整數

字串必須是有效的 32 位元整數

清單

清單、字串

清單

使用 JSON 的原生清單呈現方式

對應

對應、字串

對應

使用 JSON 的原生對應呈現方式

smallint

整數、字串

整數

字串必須是有效的 16 位元整數

設定

清單、字串

清單

使用 JSON 的原生清單呈現方式

text

字串

字串

使用 JSON 的 \u 字元跳脫

time

字串

字串

格式為 HH-MM-SS[.fffffffff] 的時間

timestamp

整數、字串

字串

時間戳記。字串常數允許輸入時間戳記作為日期,請參閱下方的 使用日期 以取得更多資訊。會傳回格式為 YYYY-MM-DD HH:MM:SS.SSS 的日期戳記。

timeuuid

字串

字串

類型 1 UUID。請參閱 常數 以取得 UUID 格式

tinyint

整數、字串

整數

字串必須是有效的 8 位元整數

清單、字串

清單

使用 JSON 的原生清單呈現方式

UDT

對應、字串

對應

使用 JSON 的原生映射表示,其中欄位名稱為金鑰

uuid

字串

字串

請參閱 常數 以取得 UUID 格式

varchar

字串

字串

使用 JSON 的 \u 字元跳脫

varint

整數、字串

整數

變動長度;可能會溢位 32 或 64 位元整數在用戶端解碼器

from_json() 函數

from_json() 函數可以使用類似 INSERT JSON 的方式,但只針對單一欄位值。它只能用在 INSERT 陳述式的 VALUES 子句中,或作為 UPDATEDELETESELECT 陳述式的其中一個欄位值。例如,它不能用在 SELECT 陳述式的選取子句中。

to_json() 函數

to_json() 函數可以使用類似 SELECT JSON 的方式,但只針對單一欄位值。它只能用在 SELECT 陳述式的選取子句中。

附錄 A:CQL 關鍵字

CQL 區分保留未保留關鍵字。保留關鍵字不能用作識別碼,它們是真正保留給語言(但可以將保留關鍵字用雙引號括起來,以將其用作識別碼)。然而,未保留關鍵字只在特定情況下具有特定含義,但否則可以用作識別碼。這些未保留關鍵字唯一的存在理由是方便:有些關鍵字在解析器是否將其用作關鍵字時,總是很容易判斷的,因此它們未保留。

關鍵字 保留?

ADD

AGGREGATE

ALL

ALLOW

變更

AND

APPLY

AS

ASC

ASCII

授權

BATCH

BEGIN

BIGINT

BLOB

BOOLEAN

BY

CALLED

CAST

CLUSTERING

COLUMNFAMILY

COMPACT

包含

計數

計數器

建立

自訂

日期

十進制

預設

刪除

遞減

描述

相異

雙精度

刪除

持續時間

項目

執行

存在

過濾

最終函數

浮點數

FROM

凍結

完整

函數

函數

授予

群組

如果

索引

網際網路

無限

初始條件

輸入

插入

整數

JSON

金鑰

金鑰

鍵空間

金鑰空間

LANGUAGE

類似

限制

清單

登入

對應

遮罩

實體化

MBEAN

MBEAN

修改

非數值

未登入

非遞迴

非超級使用者

空白

選項

排序

分割

密碼

權限

權限

主要

重新命名

取代

RETURNS

撤銷

角色

角色

架構

選擇

選擇遮罩

設定

SFUNC

小整數

靜態

儲存

STYPE

超級使用者

表格

文字

時間

時間戳記

時間 UUID

微小整數

權杖

觸發器

截斷

生存時間

元組

類型

未記錄

取消遮罩

取消設定

更新

使用

使用者

使用者

使用

UUID

變動字元

變動整數

檢視

WHERE

使用

寫入時間

附錄 B:CQL 保留類型

下列類型名稱目前未由 CQL 使用,但保留供未來使用。使用者定義類型不得使用保留類型名稱作為其名稱。

類型

位元字串

位元組

複合

date

列舉

間隔

媒體存取控制位址

變更

以下說明 CQL 各版本的變更。

3.4.3

3.4.2

3.4.2

3.4.1

  • 新增 CAST 函數。請參閱 Cast

3.4.0

  • 支援 實體化檢視

  • DELETE 支援不等式表達式和任何主鍵欄位上的 IN 限制

  • UPDATE 支援任何主鍵欄位上的 IN 限制

3.3.1

  • 語法 TRUNCATE TABLE X 現在被接受為 TRUNCATE X 的別名

3.3.0

  • 新增 聚合

  • 使用者定義函數現在透過 CREATE FUNCTIONDROP FUNCTION 提供支援。

  • 使用者定義聚合現在透過 CREATE AGGREGATEDROP AGGREGATE 提供支援。

  • 允許使用雙美元符號括起來的字串文字,作為單引號括起來的字串的替代方案。

  • 引入角色來取代基於使用者的驗證和存取控制

  • 已新增 DateTime 資料類型

  • 已新增 JSON 支援

  • 已新增 TinyintSmallint 資料類型

  • 新增新的時間轉換函數,並棄用 dateOfunixTimestampOf。請參閱 時間轉換函數

3.2.0

  • 使用者定義類型現在透過 CREATE TYPEALTER TYPEDROP TYPE 提供支援。

  • CREATE INDEX 現在支援索引集合欄位,包括透過 keys() 函數索引映射集合的鍵

  • 可以使用新的 CONTAINSCONTAINS KEY 營運子查詢集合上的索引

  • 新增元組類型來存放固定長度的類型化位置欄位集合(請參閱 類型 區段)

  • DROP INDEX 現在支援選擇性地指定鍵空間

3.1.7

  • SELECT 陳述式現在支援使用組合式群集欄位中的 IN 子句,在單一分區中選取多列。請參閱 SELECT WHERE 子句。

  • IF NOT EXISTSIF EXISTS 語法現在分別由 CREATE USERDROP USER 陳述式支援。

3.1.6

  • 已新增一個新的 uuid 方法

  • 支援 DELETE …​ IF EXISTS 語法。

3.1.5

3.1.4

  • CREATE INDEX 現在允許在建立自訂索引時指定選項(請參閱 CREATE INDEX 參考)。

3.1.3

  • 已將毫秒精確度格式新增至時間戳記剖析器(請參閱 使用日期)。

3.1.2

  • 已將 NaNInfinity 新增為有效的浮點常數。它們現在是保留關鍵字。在不太可能的情況下,如果您將它們用作欄位識別碼(或鍵空間/表格之一),現在您需要對它們加上雙引號(請參閱 引號識別碼)。

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 子句中的別名。有關詳細資訊,請參閱 選取區段

  • KEYSPACETABLEINDEXCREATE 陳述式現在支援 IF NOT EXISTS 條件。類似地,DROP 陳述式支援 IF EXISTS 條件。

  • INSERT 陳述式選擇性地支援 IF NOT EXISTS 條件,而 UPDATE 支援 IF 條件。

3.0.5

  • SELECTUPDATEDELETE 陳述式現在允許空的 IN 關係(請參閱 CASSANDRA-5626)。

3.0.4

  • 已更新自訂 次要索引 的語法。

  • 現在不再支援分割鍵上的非等於條件,即使是針對排序分割器,因為這是不正確的(順序不是分割鍵類型)。相反地,範圍查詢應始終對分割鍵使用 token 方法(請參閱 WHERE 子句 )。

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,因此會導致 令人困惑的行為。但是,已新增下列新方法來協助處理 timeuuidnowminTimeuuidmaxTimeuuiddateOfunixTimestampOf。有關更多詳細資訊,請參閱 專門針對這些方法的區段

  • `浮點常數''#constants 現在支援指數表示法。換句話說,`4.2E10 現在是有效的浮點值。

版本控制

CQL 語言的版本控制遵守 語意化版本控制 指南。版本採用 X.Y.Z 格式,其中 X、Y 和 Z 是分別代表主要、次要和修補層級的整數值。Cassandra 發行版本與 CQL 語言版本之間沒有關聯性。

版本 說明

主要

當引入向後不相容的變更時,必須升級主要版本。這應該很少發生。

次要

當引入新的,但向後相容的功能時,會增加次要版本。

修補程式

當修正錯誤時,會增加修補程式版本。