Cassandra Query Language (CQL) v3.4.3
\{toc:maxLevel=3}
CQL構文
序文
このドキュメントでは、Cassandra Query Language (CQL) バージョン3について説明します。CQL v3はCQL v2との下位互換性がなく、多くの点で異なります。このドキュメントでは、言語の最新バージョンについて説明していることに注意してください。ただし、変更セクションでは、CQL v3の異なるバージョン間の差分を提供します。
CQL v3は、データがテーブルに格納され、行と列が含まれるという意味で、SQLに非常に近いモデルを提供します。そのため、このドキュメントで使用する場合、これらの用語(テーブル、行、列)はSQLと同じ定義を持ちます。ただし、これらは、Cassandraの内部実装およびThriftとCQL v2 APIに見られる行と列の概念を参照しないことに注意してください。
規約
CQL構文の指定を支援するために、このドキュメントでは次の規約を使用します。
-
言語ルールは、BNFのような表記で記述されます。
bc(syntax). ::= TERMINAL
-
非終端記号は、
<山かっこ>
で囲まれます。 -
BNFへの追加のショートカット表記として、特定の記号がオプションであるか、または繰り返される可能性があることを示すために、従来の正規表現の記号(
?
、+
、および*
)を使用します。また、記号をグループ化するために括弧を使用し、[<characters>]
表記を使用して、<characters>
のいずれかを表すことができます。 -
文法はドキュメントの目的で提供されており、いくつかの小さな詳細が省略されています。たとえば、
CREATE TABLE
ステートメントの最後の列定義はオプションですが、このドキュメントで提供される文法がサポートされていないことを示唆している場合でも、存在する場合はサポートされます。 -
サンプルコードはコードブロックで提供されます。
bc(sample). SELECT sample_usage FROM cql;
-
実行テキスト内のキーワードまたはCQLコードの参照は、
固定幅フォント
で表示されます。
識別子とキーワード
CQL言語は、テーブル、列、およびその他のオブジェクトを識別するために、識別子(または名前)を使用します。識別子は、正規表現
に一致するトークンです。[a-zA-Z0-9_]
*
SELECT
やWITH
など、このような識別子の多くはキーワードです。それらは言語に対して固定された意味を持ち、ほとんどが予約されています。これらのキーワードのリストは、付録Aにあります。
識別子と(引用符で囲まれていない)キーワードは大文字と小文字を区別しません。したがって、SELECT
はselect
またはsElEcT
と同じであり、myId
はたとえばmyid
またはMYID
と同じです。多くの場合(特にこのドキュメントのサンプルで)使用される規約は、キーワードには大文字を使用し、その他の識別子には小文字を使用することです。
二重引用符("
)で任意の文字のシーケンスを囲むことによって定義された、引用符付き識別子と呼ばれる2番目の種類の識別子があります。引用符付き識別子はキーワードになることはありません。したがって、"select"
は予約されたキーワードではなく、列を参照するために使用できますが、select
は解析エラーを発生させます。また、引用符で囲まれていない識別子やキーワードとは対照的に、引用符で囲まれた識別子は大文字と小文字を区別します("My Quoted Id"
は"my quoted id"
とは異なります)。
に一致する完全に小文字の引用符付き識別子は、二重引用符を削除して取得した引用符で囲まれていない識別子と同等です(したがって、[a-zA-Z0-9_]
*"myid"
はmyid
およびmyId
と同等ですが、"myId"
とは異なります)。引用符付き識別子内では、二重引用符文字を繰り返してエスケープできます。したがって、"foo "" bar"
は有効な識別子です。
警告: 引用符付き識別子を使用すると、任意の名前を持つ列を宣言でき、それらがサーバーで使用される特定の名前に衝突する場合があります。たとえば、条件付き更新を使用する場合、サーバーは"[applied]"
という名前の特別な結果を含む結果セットで応答します。そのような名前の列を宣言した場合、これはツールを混乱させる可能性があり、避ける必要があります。一般に、引用符で囲まれていない識別子を使用することをお勧めしますが、引用符で囲まれた識別子を使用する場合は、角かっこで囲まれた名前("[applied]"
など)や関数呼び出しのように見える名前("f(x)"
など)を避けることを強くお勧めします。
定数
CQLは、文字列、整数、浮動小数点数、ブール値、uuid、およびblobの次の種類の定数を定義します。
-
文字列定数は、単一引用符(
'
)で囲まれた任意の文字のシーケンスです。文字列に単一引用符を含めるには、'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
は16進文字(例:[0-9a-fA-F]
)であり、{4}
はそのような文字の数です。 -
blob定数は、16進数
0[xX](hex)+
で定義されます。ここで、hex
は16進文字(例:[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 )*
::= =' ( | | )
<variable>
p.
上記の文法で可能なすべての生成が実際に有効であるとは限りません。特に、とネストされた
<collection-literal>は、現在
<collection-literal>`内では許可されていません。
<variable>
は、匿名(疑問符(?
))または名前付き(:
が前に付いた識別子)のいずれかになります。どちらも、プリペアドステートメントのバインド変数を宣言します。匿名変数と名前付き変数の唯一の違いは、名前付き変数の方が参照しやすいことです(正確には使用するクライアントドライバーによって異なります)。
<properties>
プロダクションは、キースペースとテーブルを作成および変更するステートメントで使用されます。各<property>
は単純なもので、その場合は単に値を持つか、マップのもので、その場合は値がサブオプションをグループ化するマップになります。以下では、プロパティの種類(単純またはマップ)のいずれかとして参照します。
<tablename>
はテーブルを識別するために使用されます。これはテーブル名を表す識別子で、キースペース名を前に付けることができます。キースペース名が指定されている場合、現在アクティブなキースペース(現在アクティブなキースペースは USE
ステートメントで設定されます)とは異なるキースペースのテーブルを識別できます。
サポートされている<function>
については、関数に関するセクションを参照してください。
文字列は、単一引用符または 2 つのドル記号で囲むことができます。2 番目の構文は、単一引用符を含む文字列を許可するために導入されました。このような文字列の典型的な候補は、ユーザー定義関数のソースコードの断片です。
サンプル
bc(sample)..
`some string value'
ドル記号付きの文字列には、単一の ' 引用符を含めることができます
p.
プリペアドステートメント
CQLは、プリペアドステートメントをサポートしています。プリペアドステートメントは、クエリを一度だけ解析し、異なる具体的な値で複数回実行できるようにする最適化です。
ステートメントでは、列の値が期待されるたびに(データ操作およびクエリステートメント)、代わりに<variable>
(上記参照)を使用できます。バインド変数を持つステートメントは、プリペアドである必要があります。プリペアドされた後、バインド変数に具体的な値を指定することで実行できます。ステートメントを準備し、プリペアドステートメントを実行する正確な手順は、使用されるCQLドライバに依存し、このドキュメントの範囲を超えます。
列の値を提供するだけでなく、バインドマーカーを使用してLIMIT
、TIMESTAMP
、およびTTL
句の値を提供できます。匿名バインドマーカーが使用されている場合、クエリパラメータの名前はそれぞれ[limit]
、[timestamp]
、および[ttl]
になります。
データ定義
CREATE KEYSPACE
構文
bc(syntax)..
::= CREATE KEYSPACE (IF NOT EXISTS)? WITH
p.
サンプル
bc(sample)..
CREATE KEYSPACE Excelsior
WITH replication = \{’class’: `SimpleStrategy', `replication_factor' : 3};
CREATE KEYSPACE Excalibur
WITH replication = \{’class’: NetworkTopologyStrategy', `DC1' : 1, `DC2' : 3}
ステートメントは、新しいトップレベルのキースペースを作成します。キースペースは、一連のテーブルのレプリケーション戦略といくつかのオプションを定義する名前空間です。有効なキースペース名は、英数字のみで構成され、長さが32以下の識別子です。識別子として、キースペース名は大文字と小文字を区別しないことに注意してください。大文字と小文字を区別するキースペース名には、引用符で囲まれた識別子を使用してください。
AND durable_writes = false;
p.
`CREATE KEYSPACE
CREATE KEYSPACE
でサポートされている <properties>
は次のとおりです。
名前 | 種類 | 必須 | デフォルト | 説明 |
---|---|---|---|---|
|
マップ |
はい |
キースペースに使用するレプリケーション戦略とオプション。 |
|
|
単純 |
いいえ |
true |
このキースペースでの更新にコミットログを使用するかどうか(このオプションを無効にするのは自己責任です!)。 |
replication
<property>
は必須です。少なくとも使用するレプリケーション戦略クラスを定義する'class'
サブオプションが含まれている必要があります。残りのサブオプションは、そのレプリケーション戦略クラスによって異なります。デフォルトでは、Cassandraは次の'class'
をサポートしています。
-
'SimpleStrategy'
:クラスター全体の単純なレプリケーションファクターを定義する単純な戦略。サポートされている唯一のサブオプションは、そのレプリケーションファクターを定義する'replication_factor'
で、必須です。 -
'NetworkTopologyStrategy'
:データセンターごとに独立してレプリケーションファクターを設定できるレプリケーション戦略。残りのサブオプションはキーと値のペアで、各キーはデータセンターの名前で、値はそのデータセンターのレプリケーションファクターです。
既に存在するキースペースを作成しようとすると、IF NOT EXISTS
オプションを使用しない限り、エラーが返されます。使用すると、キースペースが既に存在する場合は、ステートメントは何も操作を行いません。
USE
構文
bc(syntax). ::= USE
サンプル
bc(sample). USE myApp;
USE
ステートメントは、既存のキースペース名を引数として取り、それを接続ごとの現在の作業キースペースとして設定します。後続のすべてのキースペース固有のアクションは、特に指定がない限り、別の USE ステートメントが発行されるか、接続が終了するまで、選択されたキースペースのコンテキストで実行されます。
ALTER KEYSPACE
構文
bc(syntax)..
::= ALTER KEYSPACE (IF EXISTS)? WITH
p.
サンプル
bc(sample)..
ALTER KEYSPACE 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
が使用されている場合を除き、ステートメントはエラーを返します。この場合、操作は何も行いません。
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
オプションを使用しない限り、エラーが返されます。使用すると、テーブルが既に存在する場合は、ステートメントは何も操作を行いません。
<tablename>
有効なテーブル名は、有効なキースペース名と同じです(最大32文字の英数字識別子)。テーブル名が単独で提供された場合、テーブルは現在のキースペース(USE
を参照)内に作成されますが、既存のキースペース名(<tablename>
文法を参照)が前に付いている場合、指定されたキースペースに作成されます(ただし、現在のキースペースは変更されません)。
<column-definition>
CREATE TABLE
ステートメントは、テーブルの行が持つことができる列を定義します。列は、その名前(識別子)とその型(許可されている型とそのプロパティの詳細については、データ型のセクションを参照)によって定義されます。
テーブル内では、行はそのPRIMARY KEY
(またはより単純にキー)によって一意に識別されるため、すべてのテーブル定義は必ずPRIMARY KEYを(1つだけ)定義する必要があります。PRIMARY KEY
は、テーブルで定義された1つ以上の列で構成されます。PRIMARY KEY
が1つの列のみの場合、これは列定義の直後に直接指定できます。それ以外の場合は、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;
最後のクエリは、s
の値として'static1'
を返します。これは、s
が静的であり、したがって2回目の挿入でこの'shared'
値が変更されたためです。ただし、静的列は特定のパーティション内でのみ静的であり、上記の例で両方の行が異なるパーティション(つまり、pk
の値が異なる場合)からのものである場合、2回目の挿入では最初の行のs
の値は変更されなかったことに注意してください。
静的列が許可される場合には、いくつかの制限が適用されます
-
COMPACT STORAGE
オプション(下記参照)を持つテーブルはそれらを持つことができません -
クラスタリング列のないテーブルは静的列を持つことができません(クラスタリング列のないテーブルでは、すべてのパーティションには1行しかないので、すべての列は本質的に静的です)。
-
PRIMARY KEY
列でない列のみが静的になることができます
<option>
CREATE TABLE
ステートメントは、新しいテーブルの構成を制御する多くのオプションをサポートしています。これらのオプションは、WITH
キーワードの後に指定できます。
これらのオプションの最初のものは COMPACT STORAGE
です。このオプションは主に、CQL3 より前に作成された定義との下位互換性を目的としています (詳細については www.datastax.com/dev/blog/thrift-to-cql3 を参照してください)。このオプションは、ディスク上のデータのレイアウトをわずかにコンパクトにしますが、テーブルの柔軟性と拡張性が低下します。特に、COMPACT STORAGE
テーブルはコレクションや静的カラムを持つことができず、少なくとも 1 つのクラスタリングカラムを持つ COMPACT STORAGE
テーブルは、PRIMARY KEY
定義の一部ではないカラムをちょうど 1 つ (0 でも 2 つ以上でもなく) だけサポートします (特に、作成後にカラムを追加または削除できないことを意味します)。これらの理由から、上記の互換性維持の理由以外では、COMPACT STORAGE
は推奨されません。
もう 1 つのオプションは CLUSTERING ORDER
です。これにより、ディスク上の行の順序を定義できます。クラスタリングカラム名のリストと、それぞれのディスク上の順序 (昇順または降順) を指定します。このオプションは、SELECT
中に許可される ORDER BY
に影響を与えることに注意してください。
テーブル作成では、以下のその他の <property>
がサポートされています。
オプション | 種類 | デフォルト | 説明 |
---|---|---|---|
|
単純 |
none |
自由形式の人間が読めるコメント。 |
|
単純 |
864000 |
墓石 (削除マーカー) をガベージコレクションするまでの待ち時間。 |
|
単純 |
0.00075 |
SSTable ブルームフィルターの偽陽性の目標確率。ブルームフィルターは、指定された確率を提供するようにサイズ設定されます (したがって、この値を下げると、メモリ内およびディスク上のブルームフィルターのサイズに影響します)。 |
|
単純 |
0 |
テーブルのデフォルトの有効期限 (``TTL'') (秒単位)。 |
|
マップ |
下記を参照 |
コンパクションオプション。 下記を参照してください。 |
|
マップ |
下記を参照 |
圧縮オプション。 下記を参照してください。 |
|
マップ |
下記を参照 |
キャッシングオプション。 下記を参照してください。 |
|
単純 |
1.0 |
このオプションは、ビット劣化を検出して他のレプリカへの破損の伝播を防ぐために、読み込み中にチェックサムをチェックする確率を定義します。デフォルト値は、データチャンクが読み込まれるたびにチェックサムを適用する 1 です。チェックサムチェックを無効にするには 0 に設定し、例えば 2 回に 1 回の読み込みをチェックする場合は 0.5 に設定します。 技術的な制限により、現在これは圧縮ファイルに対してのみ適用しています。テーブルで圧縮が有効になっていない場合、チェックサムは検証されません。 |
コンパクションオプション
compaction
プロパティでは、少なくとも、使用するコンパクションストラテジークラスを定義する 'class'
サブオプションを定義する必要があります。デフォルトでサポートされているクラスは、'SizeTieredCompactionStrategy'
、'LeveledCompactionStrategy'
、および 'TimeWindowCompactionStrategy'
です。カスタムストラテジーは、文字列定数としてフルクラス名を指定することで提供できます。残りのサブオプションは、選択したクラスによって異なります。デフォルトクラスでサポートされているサブオプションは次のとおりです。
オプション | サポートされているコンパクションストラテジー | デフォルト | 説明 |
---|---|---|---|
|
all |
true |
コンパクションを有効にするかどうかを示すブール値。 |
|
all |
0.2 |
SSTable に含まれるすべてのカラムに対して、ガベージコレクション可能な墓石の割合がこの比率よりも大きい場合、その SSTable はこれらの墓石をパージする目的で (他の SSTable なしで) コンパクションされます。 |
|
all |
1 日 |
SSTable の作成時間後、 |
|
all |
false |
これを true に設定すると、より積極的な墓石コンパクションが有効になります。単一の SSTable 墓石コンパクションは、成功する可能性をチェックせずに実行されます。 |
|
SizeTieredCompactionStrategy |
50MB |
サイズ階層化ストラテジーは、コンパクションする SSTable をバケットにグループ化します。バケットは、サイズが 50% 未満異なる SSTable をグループ化します。ただし、小さいサイズの場合、これは細かすぎるバケット分割になります。 |
|
SizeTieredCompactionStrategy |
4 |
マイナーコンパクションを開始するために必要な SSTable の最小数。 |
|
SizeTieredCompactionStrategy |
32 |
1 つのマイナーコンパクションで処理される SSTable の最大数。 |
|
SizeTieredCompactionStrategy |
0.5 |
サイズ階層化では、SSTable のサイズが [average_size * |
|
SizeTieredCompactionStrategy |
1.5 |
サイズ階層化では、SSTable のサイズが [average_size * |
|
LeveledCompactionStrategy |
5MB |
レベル化ストラテジーにおける SSTable の目標サイズ (MB 単位)。SSTable のサイズは |
|
TimeWindowCompactionStrategy |
MICROSECONDS |
データの挿入時に使用されるタイムスタンプの分解能 (MILLISECONDS、MICROSECONDS など、Java TimeUnit で理解できる必要があります) - USING TIMESTAMP を使用して (またはクライアントで直接同等のものを使用して) 変異を行わない限り、これは変更しないでください。 |
|
TimeWindowCompactionStrategy |
DAYS |
ウィンドウサイズに使用される Java TimeUnit。 |
|
TimeWindowCompactionStrategy |
1 |
時間ウィンドウを構成する |
|
TimeWindowCompactionStrategy |
false |
期限切れの SSTable は、そのデータが他の SSTable をシャドーイングしているかどうかをチェックせずに削除されます。これは、単一の SSTable コンパクションに対して |
圧縮オプション
compression
プロパティには、次のサブオプションを使用できます。
オプション | デフォルト | 説明 | |||
---|---|---|---|---|---|
|
LZ4Compressor |
使用する圧縮アルゴリズム。デフォルトのコンプレッサーは、LZ4Compressor、SnappyCompressor、および DeflateCompressor です。圧縮を無効にするには、 |
|||
|
true |
デフォルトでは、圧縮は有効になっています。無効にするには、 |
|
64KB |
ディスク上の SSTable はブロック単位で圧縮されます (ランダム読み取りを可能にするため)。これは、上記のブロックのサイズ (KB 単位) を定義します。値が大きいほど圧縮率が向上する可能性がありますが、読み取りのためにディスクから読み取るデータの最小サイズが増加します。 |
キャッシングオプション
caching
プロパティには、次のサブオプションを使用できます。
オプション | デフォルト | 説明 |
---|---|---|
|
ALL |
このテーブルのキー ( |
|
NONE |
パーティションごとにキャッシュする行数 ( |
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 = A most excellent and useful column family';
ステートメントは、テーブル定義を操作するために使用されます。新しいカラムの追加、既存のカラムの削除、またはテーブルオプションの更新が可能です。テーブル作成の場合と同様に、
p.
`ALTERALTER COLUMNFAMILY
は ALTER TABLE
のエイリアスとして許可されます。テーブルが存在しない場合、ステートメントはエラーを返します。ただし、IF EXISTS
が使用されている場合、操作は何も行いません。
<tablename>
はテーブル名であり、オプションでキースペース名が前に付いています。<instruction>
は実行する変更を定義します。
-
ADD
: テーブルに新しいカラムを追加します。新しいカラムの<identifier>
は、既存のカラムと競合してはなりません。さらに、カラムはCOMPACT STORAGE
オプションで定義されたテーブルに追加できません。新しいカラムが既に存在する場合、ステートメントはエラーを返します。ただし、IF NOT EXISTS
が使用されている場合、操作は何も行いません。 -
DROP
: テーブルからカラムを削除します。削除されたカラムは、クエリですぐに使用できなくなり、将来のコンパクションされた SSTable には含まれません。カラムが再度追加された場合、クエリは、カラムが最後に削除される前に書き込まれた値を返しません。タイムスタンプは実際の時間を表すと想定されているため、そうでない場合は、以前に削除されたカラムを読み取るべきではありません。カラムは、COMPACT STORAGE
オプションで定義されたテーブルから削除できません。削除されたカラムがまだ存在しない場合、ステートメントはエラーを返します。ただし、IF EXISTS
が使用されている場合、操作は何も行いません。 -
テーブルの主キーカラムの
RENAME
。主キーではないカラムは名前を変更できません。さらに、既に存在する別の名前にカラムの名前を変更することは許可されていません。名前が変更されたカラムに依存するセカンダリインデックスがあってはならないことに注意することが重要です。名前が変更されたカラムがまだ存在しない場合、ステートメントはエラーを返します。ただし、IF EXISTS
が使用されている場合、操作は何も行いません。 -
WITH
: テーブルのオプションを更新できます。サポートされている<option>
(および構文) は、COMPACT STORAGE
がサポートされていないことを除いて、CREATE TABLE
ステートメントと同じです。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
ステートメントは、テーブルからすべてのデータを永続的に削除します。
CREATE INDEX
CREATE INDEX
ステートメントは、指定されたテーブルの指定された(既存の)列に対して新しいセカンダリインデックスを作成するために使用されます。必要に応じて、ON
キーワードの前にインデックス自体の名前を指定できます。
構文
bc(syntax)..
::= CREATE ( CUSTOM )? INDEX ( IF NOT EXISTS )? ( )?
ON `(' `)'
( USING ( WITH OPTIONS = )? )?
::=
| keys( )
p.
サンプル
bc(sample).
CREATE INDEX userIndex ON NerdMovies (user);
CREATE INDEX ON Mutants (abilityId);
CREATE INDEX ON users (keys(favs));
CREATE INDEX ON users (age) USING 'sai';
CREATE CUSTOM INDEX ON users (email) USING `path.to.the.IndexClass';
CREATE CUSTOM INDEX ON users (email) USING `path.to.the.IndexClass' WITH OPTIONS = \{’storage’: `/mnt/ssd/indexes/'};
列にデータが既に存在する場合、非同期的にインデックスが作成されます。インデックスが作成された後、列の新しいデータは挿入時に自動的にインデックス化されます。既に存在するインデックスを作成しようとすると、IF NOT EXISTS
オプションを使用しない限り、エラーが返されます。使用した場合、インデックスが既に存在する場合は、ステートメントは何も行いません。
インデックスタイプ
USING
キーワードは、オプションでインデックスタイプを指定します。2つの組み込みタイプがあります。
-
legacy_local_table - (デフォルト) レガシーセカンダリインデックス。隠されたローカルテーブルとして実装されています。
-
sai - 「ストレージアタッチド」インデックス。最適化されたSSTable / Memtableアタッチドインデックスを介して実装されます。
カスタムインデックスを作成するには、完全修飾クラス名を指定する必要があります。
マップキーのインデックス
マップ列にインデックスを作成する場合、キーまたは値のいずれかをインデックス化できます。列識別子が keys()
関数内に配置されている場合、インデックスはマップキーに作成され、WHERE
句で CONTAINS KEY
を使用できます。それ以外の場合、インデックスはマップ値に作成されます。
DROP INDEX
構文
bc(構文). ::= DROP INDEX ( IF EXISTS )? ( `.' )?
サンプル
bc(sample)..
DROP INDEX userIndex;
DROP INDEX userkeyspace.address_index;
p.DROP INDEX
ステートメントは、既存のセカンダリインデックスを削除するために使用されます。ステートメントの引数はインデックス名であり、オプションでインデックスのキースペースを指定できます。
インデックスが存在しない場合、ステートメントはエラーを返します。ただし、IF EXISTS
が使用されている場合は、操作は何も行いません。
CREATE MATERIALIZED VIEW
構文
bc(syntax)..
::= CREATE MATERIALIZED VIEW ( IF NOT EXISTS )? AS
SELECT ( `(' ( `,' ) * `)' | `' )
FROM
( WHERE )?
PRIMARY KEY `(' ( `,' ) `)'
( WITH ( AND )* )?
p.
サンプル
bc(sample)..
CREATE MATERIALIZED VIEW monkeySpecies_by_population AS
SELECT *
FROM monkeySpecies
WHERE population IS NOT NULL AND species IS NOT NULL
PRIMARY KEY (population, species)
WITH comment=Allow query by population instead of species';
CREATE MATERIALIZED VIEW
p.ステートメントは、新しいマテリアライズドビューを作成します。このような各ビューは、
SELECTステートメントで指定された基になる(またはベース)テーブルに存在する行に対応する
行のセットです。マテリアライズドビューを直接更新することはできませんが、ベーステーブルの更新はビュー内の対応する更新を引き起こします。
既に存在するマテリアライズドビューを作成しようとすると、IF NOT EXISTS
オプションを使用しない限り、エラーが返されます。使用した場合、マテリアライズドビューが既に存在する場合は、ステートメントは何も行いません。
WHERE
句
<where-clause>
は、SELECT
ステートメントのwhere句と似ていますが、いくつかの違いがあります。まず、where句には、ビューのプライマリキーの列でNULL
値を許可しない式を含める必要があります。他の制限が必要ない場合は、IS NOT NULL
式でこれを実現できます。第二に、ベーステーブルのプライマリキーにある列のみが、IS NOT NULL
以外の式で制限できます。(この2番目の制限は、将来解除される可能性があることに注意してください。)
ALTER MATERIALIZED VIEW
構文
bc(構文). ::= ALTER MATERIALIZED VIEW
WITH ( AND )*
ALTER MATERIALIZED VIEW
ステートメントを使用すると、オプションを更新できます。これらのオプションは、CREATE TABLE
のオプションと同じです。
DROP MATERIALIZED VIEW
構文
bc(構文). ::= DROP MATERIALIZED VIEW ( IF EXISTS )?
サンプル
bc(サンプル). DROP MATERIALIZED VIEW monkeySpecies_by_population;
DROP MATERIALIZED VIEW
ステートメントは、既存のマテリアライズドビューを削除するために使用されます。
マテリアライズドビューが存在しない場合、ステートメントはエラーを返します。ただし、IF EXISTS
が使用されている場合は、操作は何も行いません。
CREATE TYPE
構文
bc(syntax)..
::= CREATE TYPE ( IF NOT EXISTS )?
`(' ( `,' )* `)'
::= ( `.' )?
::=
サンプル
bc(sample)..
CREATE TYPE address (
street_name text,
street_number int,
city text,
state text,
zip int
)
CREATE TYPE work_and_home_addresses (
home_address address,
work_address address
)
p.CREATE TYPE
ステートメントは、新しいユーザー定義型を作成します。各タイプは、名前付きの型付きフィールドのセットです。フィールドタイプは、コレクションや他の既存のユーザー定義型を含む、任意の有効なタイプにできます。
既に存在するタイプを作成しようとすると、IF NOT EXISTS
オプションを使用しない限り、エラーが発生します。使用した場合、タイプが既に存在する場合は、ステートメントは何も行いません。
<typename>
有効な型名は識別子です。既存のCQL型および予約された型名の名前は使用できません。
型名が単独で指定されている場合、型は現在のキースペース(USE
を参照)で作成されます。既存のキースペース名がプレフィックスとして付いている場合、型は現在のキースペースではなく、指定されたキースペース内に作成されます。
ALTER TYPE
構文
bc(syntax)..
::= ALTER TYPE (IF EXISTS)?
::= ADD (IF NOT EXISTS)?
| RENAME (IF EXISTS)? TO ( AND TO )*
p.
サンプル
bc(sample)..
ALTER TYPE address ADD country text
ALTER TYPE address RENAME zip TO zipcode AND street_name TO street
p.ALTER TYPE
ステートメントは、型定義を操作するために使用されます。新しいフィールドの追加、既存のフィールドの名前変更、または既存のフィールドの型の変更が可能です。タイプが存在しない場合、ステートメントはエラーを返します。ただし、IF EXISTS
が使用されている場合は、操作は何も行いません。
DROP TYPE
構文
bc(syntax)..
::= DROP TYPE ( IF EXISTS )?
p.DROP TYPE
ステートメントは、タイプの即時かつ不可逆的な削除をもたらします。別のタイプまたはテーブルでまだ使用中のタイプを削除しようとすると、エラーが発生します。
タイプが存在しない場合、IF EXISTS
を使用しない限り、エラーが返されます。この場合、操作は何も行いません。
CREATE TRIGGER
構文
bc(syntax)..
::= CREATE TRIGGER ( IF NOT EXISTS )? ( )?
ON
USING
サンプル
bc(sample).
CREATE TRIGGER myTrigger ON myTable USING `org.apache.cassandra.triggers.InvertedIndex';
トリガーを構成する実際のロジックは、任意のJava(JVM)言語で記述でき、データベースの外部に存在します。トリガーコードをCassandraインストールディレクトリの lib/triggers
サブディレクトリに配置すると、クラスターの起動時にロードされ、クラスターに参加するすべてのノードに存在します。テーブルで定義されたトリガーは、要求されたDMLステートメントが発生する前に発動します。これにより、トランザクションのアトミック性が保証されます。
DROP TRIGGER
構文
bc(syntax)..
::= DROP TRIGGER ( IF EXISTS )? ( )?
ON
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
は、ユーザー定義関数を作成または置換します。
関数シグネチャ
シグネチャは、個々の関数を区別するために使用されます。シグネチャは以下で構成されます。
-
完全修飾関数名 - つまり、*キースペース*と*関数名*
-
すべての引数型を連結したリスト
キースペース名、関数名、および引数型は、デフォルトの命名規則と大文字と小文字の区別規則に従うことに注意してください。
オプションのOR REPLACE
キーワードを使用したCREATE FUNCTION
は、関数を作成するか、同じシグネチャを持つ既存の関数を置き換えます。同じシグネチャの関数が既に存在する場合、OR REPLACE
なしのCREATE FUNCTION
は失敗します。
null
値を使用した呼び出し時の動作は、各関数に対して定義する必要があります。2つのオプションがあります。
-
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
型の引数を1つだけ取る必要があります。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;
INSERT INTO NerdMovies JSON \{
movie'':
Serenity'', director'':
Joss Whedon'', ``year'': 2005}'
p.
`INSERT` ステートメントは、テーブル内の特定の行に対して1つ以上の列を書き込みます。行は `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 condition )* )?
::= ='
+' | `-') ( | | )
| `=' (
| `=' `+'
| `[' `]' `='
| `.' `='
::=
| 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';
ステートメントは、テーブル内の特定の行に対して1つ以上の列を書き込みます。 `<where-clause>` は、更新する行を選択するために使用され、 `PRIMARY KEY` を構成するすべての列を含める必要があります。その他の列の値は、 `SET` キーワードの後の `<assignment>` を介して指定されます。
p.
`UPDATE`
SQL とは異なり、`UPDATE` はデフォルトでは行の事前存在をチェックしないことに注意してください(<condition>
を使用する場合を除く。下記参照)。以前に行が存在しない場合は行が作成され、それ以外の場合は更新されます。さらに、作成または更新のどちらが発生したかを知る方法はありません。
ただし、IF
を介して一部の列に条件を使用することが可能です。その場合、条件が満たされない限り行は更新されません。ただし、IF
条件を使用すると、無視できないパフォーマンスコスト(内部的には Paxos が使用されます)が発生するため、これは控えめに使用する必要があります。
UPDATE
ステートメントでは、同じパーティションキー内のすべての更新がアトミックかつ分離して適用されます。
<assignment>
の c = c + 3
形式は、カウンターを増減するために使用されます。 `=` 記号の後の識別子は、`=` 記号の前の識別子と同じである**必要があります**(カウンターでは、特定の値の割り当てではなく、増減のみがサポートされています)。
id = id + <collection-literal>
および id[value1] = value2
形式の <assignment>
は、コレクション用です。詳細については、関連セクションを参照してください。
id.field = <term>
形式の <assignemt>
は、フリーズされていないユーザー定義型の単一のフィールドの値を設定するためのものです。
<options>
UPDATE
および INSERT
ステートメントは、次のオプションをサポートします。
-
TIMESTAMP
:操作のタイムスタンプを設定します。指定しない場合、コーディネーターは、ステートメントの実行開始時の現在時刻(マイクロ秒単位)をタイムスタンプとして使用します。これは通常、適切なデフォルトです。 -
TTL
:挿入された値のオプションの Time To Live (秒単位) を指定します。設定すると、指定された時間後に挿入された値がデータベースから自動的に削除されます。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
句を使用することで、1つのステートメントで複数の行を削除できます。不等号演算子(>=
など)を使用して、行の範囲を削除できます。
DELETE
は、UPDATE
ステートメントと同じセマンティクスでTIMESTAMP
オプションをサポートします。
DELETE
ステートメントでは、同じパーティションキー内のすべての削除がアトミックかつ分離して適用されます。
DELETE
操作は、UPDATE
およびINSERT
ステートメントと同様に、IF
句を使用することで条件付きにすることができます。ただし、INSERT
およびUPDATE
ステートメントと同様に、これは無視できないパフォーマンスコスト(内部的にはPaxosが使用されます)が発生するため、控えめに使用する必要があります。
BATCH
構文
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
は、UPDATE
ステートメントで説明されているのと同様のセマンティクスを持つTIMESTAMP
オプションをサポートします(タイムスタンプはバッチ内のすべてのステートメントに適用されます)。ただし、使用する場合は、バッチ内のステートメントで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
ステートメントは、テーブル内の1つまたは複数の行について1つまたは複数の列を読み取ります。クエリに対応する列のコレクションを含む行のresult-setを返します。JSON
キーワードを使用した場合、各行の結果には、`json''
という名前の単一の列のみが含まれます。詳細については、`SELECT JSON`のセクションを参照してください。
<select-clause>
<select-clause>
は、クエリを実行して結果セットで返す必要がある列を決定します。これは、テーブルに定義されたすべての列を選択するための、コンマ区切りのリストまたはワイルドカード文字(*
)で構成されます。ワイルドカードSELECT
クエリの場合、返される列の順序は指定されておらず、Cassandraのバージョン間で安定することが保証されていないことに注意してください。
<selector>
は、取得する列名、または1つ以上の<term>
の<function>
です。許可される関数は、<term>
の場合と同じであり、関数セクションで説明されています。これらの一般的な関数に加えて、WRITETIME
およびMAXWRITETIME
(resp. TTL
)関数を使用すると、列が挿入されたときのタイムスタンプ(resp. 列の存続時間(秒単位)(または列に有効期限が設定されていない場合はnull))を選択でき、CAST
関数を使用して、あるデータ型を別のデータ型に変換できます。WRITETIME
およびTTL
関数は、非フリーズコレクションや非フリーズユーザー定義型などのマルチセル列では使用できません。
さらに、マップとセットの個々の値は、[ <term> ]
を使用して選択できます。マップの場合、これは、そのようなエントリが存在する場合、キーに対応する値を返します。セットの場合、これは、選択したキーが存在する場合にそのキーを返し、主に要素の存在を確認する方法です。`[ <term> … <term> `]を使用してセットまたはマップのスライスを選択することもできます。この場合、両方の境界を省略できます。
AS
キーワードを使用して、任意の<selector>
にエイリアスを設定できます(例を参照)。<where-clause>
および<order-by>
句は、エイリアスではなく、元の名前で列を参照する必要があることに注意してください。
COUNT
キーワードは、*
を囲む括弧付きで使用できます。その場合、クエリはクエリに一致する行数である単一の結果を返します。COUNT(1)
はエイリアスとしてサポートされていることに注意してください。
<where-clause>
<where-clause>
は、クエリを実行する必要がある行を指定します。これは、PRIMARY KEY
の一部である列、およびそれらにセカンダリインデックスが定義されている列の関係で構成されます。
すべての関係がクエリで許可されているわけではありません。たとえば、パーティションキーに対する非等価関係(IN
は等価関係と見なされます)はサポートされていません(ただし、パーティションキーに対して非等価クエリを実行するには、以下のTOKEN
メソッドの使用を参照してください)。さらに、特定のパーティションキーの場合、クラスタリング列は行の順序付けを誘導し、それらの関係は、連続した(順序付けの場合)行のセットを選択できる関係に制限されます。たとえば、次の設定を考えます。
bc(sample).
CREATE TABLE posts (
userid text,
blog_title text,
posted_at timestamp,
entry_title text,
content text,
category int,
PRIMARY KEY (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')
は、クラスタリング順序で`blog_tile
が`John's Blog''
であり、`posted_at
が2012-01-01'
であるものより後にソートされるすべての行を要求します。特に、blog_title > 'John''s Blog'
である限り、post_at ⇐ '2012-01-01'
の行が返されます。これは、次のようにはなりません。
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
SELECT
ステートメントのLIMIT
オプションは、クエリによって返される行数を制限し、PER PARTITION LIMIT
オプションは、クエリによって特定のパーティションに対して返される行数を制限します。両方のタイプの制限を同じステートメントで使用できることに注意してください。
ALLOW FILTERING
デフォルトでは、CQLはサーバー側で「フィルタリング」を伴わないselectクエリのみを許可します。つまり、読み取られたすべての(有効な)レコードが(おそらく部分的に)結果セットで返されることがわかっているクエリです。その理由は、これらの「フィルタリングしない」クエリは、クエリによって「返される」データの量に比例した時間で実行されるという意味で、予測可能なパフォーマンスを持つからです(これはLIMIT
によって制御できます)。
ALLOW FILTERING
オプションを使用すると、フィルタリングを必要とする(一部の)クエリを明示的に許可できます。ALLOW FILTERING
を使用するクエリは、上記で定義したように、予測不可能なパフォーマンスを示す可能性があることに注意してください。つまり、少数のレコードを選択するクエリでさえ、クラスターに格納されているデータの総量に依存するパフォーマンスを示す「可能性」があります。
たとえば、生年(セカンダリインデックス付き)と居住国を持つユーザープロファイルを保持する次のテーブルを考えてみましょう。
bc(sample)..
CREATE TABLE users (
username text PRIMARY KEY,
firstname text,
lastname text,
birth_year int,
country text
)
CREATE INDEX ON users(birth_year);
p.
すると、次のクエリは有効です。
bc(sample).
SELECT * FROM users;
SELECT firstname, lastname FROM users WHERE birth_year = 1981;
なぜなら、どちらの場合も、Cassandraはこれらのクエリのパフォーマンスが返されるデータの量に比例することを保証するからです。特に、1981年に生まれたユーザーがいない場合、2番目のクエリのパフォーマンスはデータベースに格納されているユーザープロファイルの数に依存しません(少なくとも直接的にはそうではありません:セカンダリインデックスの実装上の考慮事項により、このクエリはクラスター内のノード数に依存する可能性があり、これは間接的に格納されているデータ量に依存します。それにもかかわらず、ノード数は常に、格納されているユーザープロファイルの数よりも数桁小さい数になります)。もちろん、どちらのクエリも実際には非常に大きな結果セットを返す可能性がありますが、返されるデータの量は常にLIMIT
を追加することで制御できます。
ただし、次のクエリは拒否されます。
bc(sample).
SELECT firstname, lastname FROM users WHERE birth_year = 1981 AND country = `FR';
これは、Cassandraが、クエリの結果が小さくても、大量のデータをスキャンする必要がないことを保証できないためです。通常、実際にフランス出身の人がわずかしかいなくても、1981年生まれのユーザーのインデックスエントリをすべてスキャンします。ただし、「自分が何をしているのかわかっている」場合は、ALLOW FILTERING
を使用してこのクエリの実行を強制できます。したがって、次のクエリは有効です。
bc(sample).
SELECT firstname, lastname FROM users WHERE birth_year = 1981 AND country = `FR' ALLOW FILTERING;
データベースロール
CREATE ROLE
構文
bc(syntax)..
::= CREATE ROLE ( IF NOT EXISTS )? ( WITH ( AND )* )?
::= PASSWORD =
| LOGIN =
| SUPERUSER =
| OPTIONS =
p.
サンプル
bc(sample).
CREATE ROLE new_role;
CREATE ROLE alice WITH PASSWORD = `password_a' AND LOGIN = true;
CREATE ROLE bob WITH PASSWORD = `password_b' AND LOGIN = true AND SUPERUSER = true;
CREATE ROLE carlos WITH OPTIONS = \{ `custom_option1' : `option1_value', `custom_option2' : 99 };
デフォルトでは、ロールはLOGIN
権限またはSUPERUSER
ステータスを持ちません。
データベースリソースに対する権限は、ロールに付与されます。リソースの種類には、キースペース、テーブル、関数、ロール自体が含まれます。ロールは、階層的な権限構造を作成するために他のロールに付与できます。これらの階層では、権限とSUPERUSER
ステータスは継承されますが、LOGIN
権限は継承されません。
ロールにLOGIN
権限がある場合、クライアントは接続時にそのロールとして識別できます。その接続の間、クライアントはそのロールに付与されたすべてのロールと権限を取得します。
クライアントがSUPERUSER
でない限り、データベースロールリソースに対するCREATE
権限を持つクライアントのみがCREATE ROLE
リクエストを発行できます(以下の関連セクションを参照してください)。Cassandraでのロール管理はプラグ可能であり、カスタム実装ではリストされたオプションのサブセットのみがサポートされる場合があります。
ロール名に英数字以外の文字が含まれる場合は、引用符で囲む必要があります。
ALTER ROLE
構文
bc(syntax)..
::= ALTER ROLE (IF EXISTS)? ( WITH ( AND )* )?
::= PASSWORD =
| LOGIN =
| SUPERUSER =
| OPTIONS =
p.
サンプル
bc(sample).
ALTER ROLE bob WITH PASSWORD = `PASSWORD_B' AND SUPERUSER = false;
ロールが存在しない場合、IF EXISTS
が使用されている場合を除き、ステートメントはエラーを返します。この場合、操作は何も実行しません。
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
ステータスを持つクライアントのみが、別のSUPERUSER
ロールをDROP
できます。
存在しないロールを削除しようとすると、IF EXISTS
オプションを使用しない限り、無効なクエリ条件になります。オプションが使用され、ロールが存在しない場合、ステートメントは何も実行しません。
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).
CREATE USER alice WITH PASSWORD `password_a' SUPERUSER;
CREATE USER bob WITH PASSWORD `password_b' NOSUPERUSER;
CREATE USER
は、LOGIN
オプションがtrue
であるCREATE ROLE
と同等です。したがって、次のステートメントのペアは同等です。
bc(sample)..
CREATE USER alice WITH PASSWORD `password_a' SUPERUSER;
CREATE ROLE alice WITH PASSWORD = `password_a' AND LOGIN = true AND SUPERUSER = true;
CREATE USER IF NOT EXISTS alice WITH PASSWORD `password_a' SUPERUSER;
CREATE ROLE IF NOT EXISTS alice WITH PASSWORD = `password_a' AND LOGIN = true AND SUPERUSER = true;
CREATE USER alice WITH PASSWORD `password_a' NOSUPERUSER;
CREATE ROLE alice WITH PASSWORD = `password_a' AND LOGIN = true AND SUPERUSER = false;
CREATE USER alice WITH PASSWORD `password_a' NOSUPERUSER;
CREATE ROLE alice WITH PASSWORD = `password_a' AND LOGIN = true;
CREATE USER alice WITH PASSWORD `password_a';
CREATE ROLE alice WITH PASSWORD = `password_a' AND LOGIN = true;
p.
ALTER USER
構文
bc(syntax)..
::= ALTER USER (IF EXISTS)? ( WITH PASSWORD )? ( )?
::= SUPERUSER
| NOSUPERUSER
p.
bc(sample).
ALTER USER alice WITH PASSWORD `PASSWORD_A';
ALTER USER bob SUPERUSER;
ユーザーが存在しない場合、IF EXISTS
が使用されている場合を除き、ステートメントはエラーを返します。この場合、操作は何も実行しません。
データベースID
データ制御
権限
リソースに対する権限はロールに付与されます。Cassandraにはいくつかの異なるタイプのリソースがあり、各タイプは階層的にモデル化されています。
-
データリソース、キースペース、テーブルの階層構造は、
ALL KEYSPACES
→KEYSPACE
→TABLE
です。 -
関数リソースの構造は、
ALL FUNCTIONS
→KEYSPACE
→FUNCTION
です。 -
ロールを表すリソースの構造は、
ALL ROLES
→ROLE
です。 -
MBeans/MXBeansのセットにマップされるJMX ObjectNamesを表すリソースの構造は、
ALL MBEANS
→MBEAN
です。
権限は、これらの階層の任意のレベルで付与でき、下位に流れます。したがって、チェーンの上位にあるリソースに対する権限を付与すると、自動的に下位にあるすべてのリソースに同じ権限が付与されます。たとえば、KEYSPACE
で SELECT
を付与すると、その KEYSPACE
内のすべての TABLES
で自動的に付与されます。同様に、ALL FUNCTIONS
に対する権限を付与すると、どのキースペースにスコープされているかに関係なく、定義されたすべての関数に付与されます。特定のキースペースにスコープされたすべての関数に権限を付与することも可能です。
権限の変更は、既存のクライアントセッションに表示されます。つまり、権限の変更後に接続を再確立する必要はありません。
利用可能な権限の完全なセットは次のとおりです。
-
CREATE
-
ALTER
-
DROP
-
SELECT
-
MODIFY
-
AUTHORIZE
-
DESCRIBE
-
EXECUTE
-
UNMASK
-
SELECT_MASKED
すべての権限がすべてのタイプのリソースに適用できるわけではありません。たとえば、EXECUTE
は関数または mbeans のコンテキストでのみ関連します。テーブルを表すリソースに EXECUTE
を付与するのは無意味です。適用できないリソースに対して GRANT
権限を付与しようとすると、エラー応答が発生します。以下に、どの権限をどのタイプのリソースに付与できるか、およびその権限によって有効になるステートメントを示します。
権限 | リソース | 操作 | |||
---|---|---|---|---|---|
|
|
|
|||
|
|
指定されたキースペースでの |
|||
|
|
任意のキースペースでの |
|||
|
|
キースペースでの |
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
既存のものを置き換える |
|||
|
|
キースペース内の既存のものを置き換える |
|||
|
|
既存のものを置き換える |
|||
|
|
任意のロールに対する |
|||
|
|
|
|||
|
|
|
|||
|
|
指定されたキースペースでの |
|||
|
|
|
|||
|
|
任意のキースペースでの |
|||
|
|
キースペースでの |
|||
|
|
|
|||
|
|
任意のロールに対する |
|||
|
|
|
|||
|
|
任意のテーブルに対する |
|||
|
|
キースペース内の任意のテーブルに対する |
|||
|
|
指定されたテーブルに対する |
|||
|
|
任意のmbeanに対するgetterメソッドの呼び出し |
|||
|
|
ワイルドカードパターンに一致する任意のmbeanに対するgetterメソッドの呼び出し |
|||
|
|
名前付きのmbeanに対するgetterメソッドの呼び出し |
|||
|
|
任意のテーブルに対する |
|||
|
|
キースペース内の任意のテーブルに対する |
|
|
|
|
|
任意のmbeanに対するsetterメソッドの呼び出し |
|||
|
|
ワイルドカードパターンに一致する任意のmbeanに対するsetterメソッドの呼び出し |
|||
|
|
名前付きのmbeanに対するsetterメソッドの呼び出し |
|||
|
|
任意のテーブルに対する |
|||
|
|
キースペース内のテーブルに対する |
|||
|
|
|
|||
|
|
任意の関数に対する |
|||
|
|
キースペースでの |
|||
|
|
キースペースでの |
|||
|
|
|
|||
|
|
任意のmbeanに対する |
|||
|
|
ワイルドカードパターンに一致する任意のmbeanに対する |
|||
|
|
名前付きのmbeanに対する |
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
@ALL MBEANS |
プラットフォームのMBeanServerから任意のmbeanに関するメタデータを取得する |
|||
|
@MBEANS |
プラットフォームのMBeanServerからワイルドカードパターンに一致する任意のmbeanに関するメタデータを取得する |
|||
|
@MBEAN |
プラットフォームのMBeanServerから名前付きのmbeanに関するメタデータを取得する |
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
任意のmbeanに対する操作の実行 |
|||
|
|
ワイルドカードパターンに一致する任意のmbeanに対する操作の実行 |
|||
|
|
名前付きのmbeanに対する操作の実行 |
|||
|
|
任意のテーブルのマスクされた列のクリアな内容を表示 |
|||
|
|
キースペース内の任意のテーブルのマスクされた列のクリアな内容を表示 |
|||
|
|
指定されたテーブルのマスクされた列のクリアな内容を表示 |
|||
|
|
任意のテーブルのマスクされた列を制限した |
|||
|
|
指定されたキースペース内の任意のテーブルのマスクされた列を制限した |
|||
|
|
指定されたテーブルのマスクされた列を制限した |
GRANT PERMISSION
構文
bc(syntax)..
::= GRANT ( ALL ( PERMISSIONS )? | ( PERMISSION )? ) ON TO
::= CREATE | ALTER | DROP | SELECT | MODIFY | AUTHORIZE | DESCRIBE | UNMASK | SELECT_MASKED EXECUTE
::= ALL KEYSPACES
| KEYSPACE
| ( TABLE )?
| ALL ROLES
| ROLE
| ALL FUNCTIONS ( IN KEYSPACE )?
| FUNCTION
| ALL MBEANS
| ( MBEAN | MBEANS )
p.
サンプル
bc(sample).
GRANT SELECT ON ALL KEYSPACES TO data_reader;
これにより、data_reader
ロールを持つすべてのユーザーに、すべてのキースペースにわたって任意のテーブルでSELECT
ステートメントを実行する権限が付与されます。
bc(sample).
GRANT MODIFY ON KEYSPACE keyspace1 TO data_writer;
これにより、data_writer
ロールを持つすべてのユーザーに、keyspace1
キースペース内のすべてのテーブルでUPDATE
、INSERT
、UPDATE
、DELETE
、およびTRUNCATE
クエリを実行する権限が付与されます。
bc(sample).
GRANT DROP ON keyspace1.table1 TO schema_owner;
これにより、schema_owner
ロールを持つすべてのユーザーに、keyspace1.table1
を DROP
する権限が付与されます。
bc(sample).
GRANT EXECUTE ON FUNCTION keyspace1.user_function( int ) TO report_writer;
これにより、report_writer
ロールを持つすべてのユーザーに、関数 keyspace1.user_function( int )
を使用する SELECT
、INSERT
、およびUPDATE
クエリを実行する権限が付与されます。
bc(sample).
GRANT DESCRIBE ON ALL ROLES TO role_admin;
これにより、role_admin
ロールを持つすべてのユーザーに、LIST ROLES
ステートメントを使用してシステム内のすべてのロールを表示する権限が付与されます。
REVOKE PERMISSION
構文
bc(syntax)..
::= REVOKE ( ALL ( PERMISSIONS )? | ( PERMISSION )? ) ON FROM
::= CREATE | ALTER | DROP | SELECT | MODIFY | AUTHORIZE | DESCRIBE | UNMASK | SELECT_MASKED EXECUTE
::= ALL KEYSPACES
| KEYSPACE
| ( TABLE )?
| ALL ROLES
| ROLE
| ALL FUNCTIONS ( IN KEYSPACE )?
| FUNCTION
| ALL MBEANS
| ( MBEAN | MBEANS )
p.
サンプル
bc(sample)..
REVOKE SELECT ON ALL KEYSPACES FROM data_reader;
REVOKE MODIFY ON KEYSPACE keyspace1 FROM data_writer;
REVOKE DROP ON keyspace1.table1 FROM schema_owner;
REVOKE EXECUTE ON FUNCTION keyspace1.user_function( int ) FROM report_writer;
REVOKE DESCRIBE ON ALL ROLES FROM role_admin;
p.
LIST PERMISSIONS
構文
bc(syntax)..
::= LIST ( ALL ( PERMISSIONS )? | )
( ON )?
( OF ( NORECURSIVE )? )?
::= ALL KEYSPACES
| KEYSPACE
| ( TABLE )?
| ALL ROLES
| ROLE
| ALL FUNCTIONS ( IN KEYSPACE )?
| FUNCTION
| ALL MBEANS
| ( MBEAN | MBEANS )
p.
サンプル
bc(sample).
LIST ALL PERMISSIONS OF alice;
他のロールから推移的に取得したものを含め、alice
に付与されたすべての権限を表示します。
bc(sample).
LIST ALL PERMISSIONS ON keyspace1.table1 OF bob;
他のロールから推移的に取得したものを含め、bob
に付与されたkeyspace1.table1
のすべての権限を表示します。これには、keyspace1.table1
に適用できるリソース階層の上位にあるすべての権限も含まれます。たとえば、bob
が keyspace1
に対する ALTER
権限を持っている場合、その権限はこのクエリの結果に含まれます。NORECURSIVE
スイッチを追加すると、結果は bob
または bob
のロールのいずれかに直接付与された権限のみに制限されます。
bc(sample).
LIST SELECT PERMISSIONS OF carlos;
リソースに対する SELECT
権限に限定して、carlos
または carlos
のロールに付与された権限を表示します。
データ型
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 文字列 |
|
integers |
64ビット符号付き長整数 |
|
blobs |
任意のバイト列(検証なし) |
|
ブール値 |
true または false |
|
integers |
カウンター列(64ビット符号付き値)。詳細についてはカウンターを参照してください。 |
|
整数、文字列 |
日付(対応する時間値なし)。詳細については、以下の日付の操作を参照してください。 |
|
整数、浮動小数点数 |
可変精度10進数 |
|
integers |
64ビットIEEE-754浮動小数点数 |
|
整数、浮動小数点数 |
32ビットIEEE-754浮動小数点数 |
|
文字列 |
IPアドレス。4バイト長(IPv4)または16バイト長(IPv6)のいずれかになります。 |
|
integers |
32ビット符号付き整数 |
|
integers |
16ビット符号付き整数 |
|
文字列 |
UTF8エンコードされた文字列 |
|
整数、文字列 |
ナノ秒精度の時間。詳細については、以下の時間の操作を参照してください。 |
|
整数、文字列 |
タイムスタンプ。文字列定数を使用して、日付としてタイムスタンプを入力できます。詳細については、以下のタイムスタンプの操作を参照してください。 |
|
uuids |
タイプ1 UUID。これは一般的に「コンフリクトフリー」のタイムスタンプとして使用されます。Timeuuidに関する関数も参照してください。 |
|
integers |
8ビット符号付き整数 |
|
uuids |
タイプ1またはタイプ4 UUID |
|
文字列 |
UTF8エンコードされた文字列 |
|
integers |
任意精度整数 |
コレクション型の使用方法の詳細については、以下のコレクションの操作セクションを参照してください。
タイムスタンプの操作
timestamp
型の値は、標準ベース時間である「エポック」:1970年1月1日00:00:00 GMTからのミリ秒数を表す64ビット符号付き整数としてエンコードされます。
タイムスタンプは、上記で定義したエポックからのミリ秒数を表す単純な長整数としてCQLに入力できます。
また、次のいずれかのISO 8601形式の文字列リテラルとして入力することもできます。それぞれ、2011年2月3日午前4時5分00秒(GMT)を表します。
-
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
はGMTを表します。米国太平洋標準時は-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
型の値は、範囲の中央(2^31)に「エポック」を持つ日数を表す32ビット符号なし整数としてエンコードされます。エポックは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
以外のテーブルのすべての列がカウンター型であるか、いずれもカウンター型ではありません。
コレクションの操作
注目すべき特徴
コレクションは、比較的小量のデータを格納/非正規化するためのものです。これらは、「特定のユーザーの電話番号」、「電子メールに適用されたラベル」などの場合に適しています。ただし、項目が無制限に増加することが予想される場合(「特定のユーザーが送信したすべてのメッセージ」、「センサーによって登録されたイベント」など)は、コレクションは適切ではなくなり、特定のテーブル(クラスタリング列を使用)を使用する必要があります。具体的には、コレクションには次の制限があります。
-
コレクションは常に全体が読み込まれます(1つを読み込むことは内部的にページングされません)。
-
コレクションは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'
TTLはINSERT
とUPDATE
の両方で許可されていますが、どちらの場合でも、設定されたTTLは新しく挿入/更新された値にのみ適用されます。つまり、
bc(sample).
UPDATE users USING TTL 10 SET favs[`color'] = `green' WHERE id = `jsmith'
は、{ 'color' : 'green' }
レコードにのみTTLを適用し、マップの残りの部分は影響を受けません。
マップレコードの削除は、次のように行われます。
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' });
セットの値の追加と削除は、既存のset
列に新しいセット値を追加/削除することにより、UPDATE
で実行できます。
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
)
以下で説明するように、リストには考慮すべきいくつかの制限とパフォーマンスに関する考慮事項があることに注意してください。可能であれば、リストよりもセットを優先することをお勧めします。
list
データの書き込みは、JSONスタイルの構文を使用して行われます。INSERT
を使用してレコードを書き込むには、リスト全体をJSON配列として指定します。注:INSERT
は常にリスト全体を置き換えます。
bc(sample).
INSERT INTO plays (id, game, players, scores)
VALUES (`123-afde', `quake', 3, [17, 4, 2]);
リストへの値の追加(追加または先頭への追加)は、既存のlist
列に新しい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';
追加と先頭への追加はべき等な操作ではないことに注意する必要があります。これは、追加または先頭への追加中に操作がタイムアウトした場合、操作を再試行することは必ずしも安全ではないことを意味します(これにより、レコードが2回追加または先頭に追加される可能性があります)。
リストには、以下の操作も用意されています。リスト内の要素を位置で設定する、リスト内の要素を位置で削除する、リスト内の特定の値をすべて削除する。ただし、他のすべてのコレクション操作とは対照的に、これら3つの操作は更新前に内部的な読み取りを発生させるため、一般的にパフォーマンス特性が遅くなります。これらの操作には、以下の構文があります。
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は、データ型をそれ自身のデータ型に変換するキャストを黙って無視します。
from | to |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
変換は、Javaのセマンティクスに厳密に依存します。たとえば、double値の1は、テキスト値の「1.0」に変換されます。
bc(sample).
SELECT avg(cast(count as double)) FROM myTable
トークン
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で指定されているTime-Based UUID生成プロセスを尊重していないためです。特に、これらの2つのメソッドによって返される値は一意ではありません。これは、これらのメソッドをクエリ(上記の例のように)にのみ使用する必要があることを意味します。これらのメソッドの結果を挿入することは、ほぼ間違いなく悪い考えです。
時間変換関数
timeuuid
、timestamp
、またはdate
を別のネイティブ
型に変換
するために、いくつかの関数が提供されています。
関数名 | 入力型 | 説明 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
集計
集計関数は、行のセットに対して機能します。各行の値を受け取り、セット全体に対して1つの値を返します。通常
列、スカラー関数
、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での関数の定義をサポートしています。他のJSR 223準拠のスクリプト言語(Python、Ruby、Scalaなど)のサポートは、3.0.11で削除されました。
UDFはCassandraスキーマの一部です。そのため、クラスター内のすべてのノードに自動的に伝播されます。
UDFはオーバーロードできます。つまり、引数の型が異なり、関数名が同じ複数のUDF。例
bc(sample).
CREATE FUNCTION sample ( arg int ) …;
CREATE FUNCTION sample ( arg text ) …;
ユーザー定義関数は、選択したプログラミング言語の通常のすべての問題の影響を受けます。したがって、実装は、nullポインタ例外、不正な引数、またはその他の潜在的な例外の原因に対して安全である必要があります。関数実行中に例外が発生すると、ステートメント全体が失敗します。
コレクション、タプル型、ユーザー定義型などの複合型を引数および戻り値の型として使用することは有効です。タプル型とユーザー定義型は、DataStax Java Driverの変換関数によって処理されます。タプル型とユーザー定義型の処理の詳細については、Java Driverのドキュメントを参照してください。
関数の引数は、リテラルまたは用語にすることができます。準備されたステートメントのプレースホルダーも使用できます。
UDFのソースコードを二重引用符で囲む構文を使用できることに注意してください。例:
bc(sample)..
CREATE FUNCTION some_function ( arg int )
RETURNS NULL ON NULL INPUT
RETURNS int
LANGUAGE java
AS return arg; ;
SELECT some_function(column) FROM atable …;
UPDATE atable SET col = some_function(?) …;
p.
bc(sample).
CREATE TYPE custom_type (txt text, i int);
CREATE FUNCTION fct_using_udt ( udtarg frozen )
RETURNS NULL ON NULL INPUT
RETURNS text
LANGUAGE java
AS return udtarg.getString(``txt''); ;
暗黙的に利用可能なudfContext
フィールド(またはスクリプトUDFのバインディング)は、新しいUDT値とタプル値を作成するために必要な機能を提供します。
bc(sample).
CREATE TYPE custom_type (txt text, i int);
CREATE FUNCTION fct_using_udt ( somearg int )
RETURNS NULL ON NULL INPUT
RETURNS custom_type
LANGUAGE java
AS + UDTValue udt = udfContext.newReturnUDTValue(); + udt.setString(``txt'', ``some string''); + udt.setInt(``i'', 42); + return udt; + ;
UDFContext
インターフェースの定義は、Apache Cassandraのソースコードorg.apache.cassandra.cql3.functions.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を使用してカスタム集約関数を作成できます。集約関数の一般的な例は、count、min、およびmaxです。
各集約には、タイプSTYPE
の初期状態(INITCOND
。デフォルトはnull
)が必要です。状態関数の最初の引数は、タイプSTYPE
である必要があります。状態関数の残りの引数は、ユーザー定義集約引数の型と一致する必要があります。状態関数は行ごとに1回呼び出され、状態関数によって返される値が新しい状態になります。すべての行が処理された後、オプションの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)"
のマップになります。ただし、これには1つの注目すべき例外があります。INSERT JSON
の動作との対称性のため、大文字を含む大文字と小文字を区別する列名は二重引用符で囲まれます。たとえば、SELECT JSON myColumn FROM …’'
は、マップキー"\"myColumn\""
になります(エスケープされた引用符に注意してください)。
マップ値は、結果セットの値のJSON
エンコードされた表現(下記を参照)になります。
INSERT JSON
INSERT
ステートメントでは、新しいJSON
キーワードを使用して、JSON
エンコードされたマップを単一行として挿入できます。JSON
マップの形式は、一般に、同じテーブルに対するSELECT JSON
ステートメントによって返される形式と一致する必要があります。特に、大文字と小文字を区別する列名は二重引用符で囲む必要があります。たとえば、myKey''
とvalue''
という名前の2つの列を持つテーブルに挿入するには、次のようにします。
bc(sample).
INSERT INTO mytable JSON `\{\''myKey\
'': 0, ``value'': 0}'
JSON
マップから省略された列は、すべてNULL
値にデフォルト設定されます(これにより、墓標が作成されます)。
Cassandraデータ型のJSONエンコーディング
可能な場合、Cassandraはデータ型をネイティブのJSON
表現で表現および受け入れます。Cassandraは、すべての単一フィールド型に対して、CQLリテラル形式に一致する文字列表現も受け入れます。たとえば、float、int、UUID、および日付は、CQLリテラル文字列で表現できます。ただし、コレクション、タプル、ユーザー定義型などの複合型は、ネイティブのJSON
コレクション(マップとリスト)またはコレクションのJSONエンコードされた文字列表現で表現する必要があります。
次の表は、CassandraがINSERT JSON
値(およびfrom_json()
引数)で受け入れるエンコーディングと、CassandraがSELECT JSON
ステートメント(およびfrom_json()
)のデータを返すときに使用する形式について説明しています。
型 | 受け入れられる形式 | 返される形式 | 備考 |
---|---|---|---|
|
文字列 |
文字列 |
JSONの |
|
整数、文字列 |
整数 |
文字列は有効な64ビット整数である必要があります |
|
文字列 |
文字列 |
文字列は、0xとそれに続く偶数の16進数で始まる必要があります |
|
ブール値、文字列 |
boolean |
文字列は |
|
文字列 |
文字列 |
|
|
整数、浮動小数点、文字列 |
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は、予約済キーワードと非予約済キーワードを区別します。予約済キーワードは識別子として使用できません。これらは言語用に予約されています(ただし、予約済キーワードを二重引用符で囲むと、識別子として使用できます)。ただし、非予約済キーワードは、特定のコンテキストでのみ特定の意味を持ちますが、それ以外の場合は識別子として使用できます。これらの非予約済キーワードの唯一の存在理由は、利便性です。一部のキーワードは、パーサーがキーワードとして使用されているかどうかを常に簡単に判断できた場合、非予約済になります。
キーワード | 予約済? |
---|---|
|
はい |
|
いいえ |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
はい |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
はい |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
はい |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
はい |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
はい |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
はい |
|
はい |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
はい |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
いいえ |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
いいえ |
付録B:CQL予約済型
次の型名は現在CQLで使用されていませんが、将来の使用のために予約されています。ユーザー定義型は、予約済の型名をその名前として使用することはできません。
型 |
---|
|
|
|
|
|
|
|
変更点
以下は、CQLの各バージョンにおける変更点について説明します。
3.4.3
-
GROUP BY
のサポート。<group-by>
を参照してください(CASSANDRA-10707を参照)。
3.4.2
-
コレクションの要素およびスライスを選択する機能のサポート(CASSANDRA-7396)。
3.4.2
-
INSERT/UPDATE options
で、default_time_to_liveが指定されているテーブルに対してTTLを0に指定すると、挿入または更新された値からTTLが削除されます。 -
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.4.0
-
マテリアライズドビューのサポート。
-
DELETE
で、任意のプライマリキー列における不等式表現とIN
制約のサポート。 -
UPDATE
で、任意のプライマリキー列におけるIN
制約のサポート。
3.3.0
-
新しい 集計関数を追加しました。
-
ユーザー定義関数が、
CREATE FUNCTION
およびDROP FUNCTION
を通じてサポートされるようになりました。 -
ユーザー定義集計関数が、
CREATE AGGREGATE
およびDROP AGGREGATE
を通じてサポートされるようになりました。 -
シングルクォートで囲まれた文字列の代替として、ダラー記号で囲まれた文字列リテラルを許可します。
-
ユーザーベースの認証およびアクセス制御に代わるロールを導入しました。
-
JSON
のサポートが追加されました。 -
Tinyint
およびSmallint
データ型が追加されました。 -
新しい時間変換関数を追加し、
dateOf
およびunixTimestampOf
を非推奨にしました。Time conversion functions
を参照してください。
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
で、CUSTOM インデックスを作成する際にオプションを指定できるようになりました(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
ステートメントが、select 句でエイリアスをサポートするようになりました。WHERE および ORDER BY 句でのエイリアスはサポートされていません。詳細については、select に関するセクションを参照してください。 -
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.4
-
カスタム セカンダリインデックスの構文が更新されました。
-
パーティションキーに対する非等式条件は、パーティションキーの並び順が正しくなかったため(順序はパーティションキーの型のものではありませんでした)、順序パーティショナーでもサポートされなくなりました。代わりに、パーティションキーに対する範囲クエリには常に
token
メソッドを使用する必要があります(WHERE 句を参照)。
3.0.3
-
カスタム セカンダリインデックスのサポートが追加されました。
3.0.2
-
定数の型検証が修正されました。たとえば、実装では、
int
列の有効な値として'2'
(2
と同等に解釈)、またはblob
値の有効な値として42
(この場合、42
は blob の16進数表現として解釈)を許可していました。これはもう当てはまりません。定数の型検証がより厳密になりました。どの型に対してどの定数が許可されるかについての詳細は、データ型のセクションを参照してください。 -
前の点で修正された型検証により、blob の入力が可能なblob 定数が導入されました。このバージョンでは、文字列定数としての blob の入力は引き続きサポートされていますが(blob 定数へのスムーズな移行を可能にするため)、非推奨になりました(特に、データ型のセクションでは、文字列定数を有効な blob としてリストしていません)。将来のバージョンで削除されます。文字列を blob として使用していた場合は、クライアントコードをできるだけ早く更新して、blob 定数に切り替える必要があります。
-
ネイティブ型を blob に変換する多くの関数も導入されました。さらに、トークン関数が select 句でも許可されるようになりました。詳細については、関数に関するセクションを参照してください。
3.0.1
-
日付文字列(およびタイムスタンプ)は、有効な
timeuuid
値として受け入れられなくなりました。そうすることは、日付文字列が有効なtimeuuid
ではないという意味でバグであり、混乱を招く動作につながっていました。ただし、timeuuid
の操作を支援するために、次の新しいメソッドが追加されました。now
、minTimeuuid
、maxTimeuuid
、dateOf
、およびunixTimestampOf
。詳細については、これらのメソッドに関するセクションを参照してください。 -
``浮動小数点定数''#constants
が指数表記をサポートするようになりました。言い換えれば、4.2E10
が有効な浮動小数点値になりました。
バージョニング
CQL言語のバージョニングは、セマンティックバージョニングガイドラインに従います。バージョンはX.Y.Zの形式を取ります。ここで、X、Y、およびZは、それぞれメジャー、マイナー、およびパッチレベルを表す整数値です。CassandraのリリースバージョンとCQL言語バージョンには相関関係はありません。
バージョン | 説明 |
---|---|
メジャー |
下位互換性のない変更が導入された場合、メジャーバージョンを必ず上げる必要があります。これはめったに発生しません。 |
マイナー |
新しいが下位互換性のある機能が導入された場合、マイナーバージョンが増加します。 |
パッチ |
バグが修正された場合、パッチバージョンが増加します。 |