Cassandraドキュメント

バージョン

プレリリース版のドキュメントを表示しています。

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_]*に一致するトークンです。

SELECTWITHなど、このような識別子の多くはキーワードです。それらは言語に対して固定された意味を持ち、ほとんどが予約されています。これらのキーワードのリストは、付録Aにあります。

識別子と(引用符で囲まれていない)キーワードは大文字と小文字を区別しません。したがって、SELECTselectまたは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+])?で定義されます。さらに、NaNInfinityも浮動小数点数定数です。

  • ブール定数は、大文字と小文字を区別せずに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

したがって、項は次のいずれかです。

  • 定数

  • コレクションベクトルユーザー定義型、またはタプルのいずれかのリテラル

  • 関数呼び出し(ネイティブ関数またはユーザー定義関数

  • 項間の算術演算

  • 型のヒント

  • 実行時にバインドされる変数を表すバインドマーカー。詳細については、prepared-statementsのセクションを参照してください。バインドマーカーは、匿名(?)または名前付き(:some_name)のいずれかになります。後者の形式では、バインドするために変数を参照するより便利な方法が提供され、一般的に推奨されます。

コメント

CQLのコメントは、二重ダッシュ(--)または二重スラッシュ(//)で始まる行です。

複数行コメントは、//で囲むことによってもサポートされています(ただし、ネストはサポートされていません)。

bc(sample).
— これはコメントです
/* これは
複数行コメントです */

ステートメント

CQLはステートメントで構成されています。SQLと同様に、これらのステートメントは3つのカテゴリに分類できます。

  • データを保存する方法を設定および変更できるデータ定義ステートメント。

  • データを変更できるデータ操作ステートメント

  • データを検索するためのクエリ

すべてのステートメントはセミコロン(;)で終わりますが、単一のステートメントを扱う場合は、そのセミコロンを省略できます。サポートされているステートメントは、次のセクションで説明します。これらのステートメントの文法を説明するとき、以下で定義される非終端記号を再利用します。

bc(syntax)..
::= 予約語を除く、引用符付きまたは引用符で囲まれていない任意の識別子
::= ( `.')?

::= 文字列定数
::= 整数定数
::= 浮動小数点数定数
::= |
::= uuid定数
::= ブール定数
::= blob定数

::=
|
|
|
|
::= ?'
| `:'
::=
|
|
| `(' ( (
,' )*)? `)'

::=
|
|
::= `\{' ( `:' ( `,' `:' )* )? `}'
::= `\{' ( ( `,' )* )? `}'
::= `[' ( ( `,' )* )? `]'

::=

::= (AND )*
::= =' ( | | )
p.
上記の文法で可能なすべての生成が実際に有効であるとは限りません。特に、
<variable>とネストされた<collection-literal>は、現在<collection-literal>`内では許可されていません。

<variable>は、匿名(疑問符(?))または名前付き(:が前に付いた識別子)のいずれかになります。どちらも、プリペアドステートメントのバインド変数を宣言します。匿名変数と名前付き変数の唯一の違いは、名前付き変数の方が参照しやすいことです(正確には使用するクライアントドライバーによって異なります)。

<properties> プロダクションは、キースペースとテーブルを作成および変更するステートメントで使用されます。各<property>単純なもので、その場合は単に値を持つか、マップのもので、その場合は値がサブオプションをグループ化するマップになります。以下では、プロパティの種類単純またはマップ)のいずれかとして参照します。

<tablename>はテーブルを識別するために使用されます。これはテーブル名を表す識別子で、キースペース名を前に付けることができます。キースペース名が指定されている場合、現在アクティブなキースペース(現在アクティブなキースペースは USE ステートメントで設定されます)とは異なるキースペースのテーブルを識別できます。

サポートされている<function>については、関数に関するセクションを参照してください。

文字列は、単一引用符または 2 つのドル記号で囲むことができます。2 番目の構文は、単一引用符を含む文字列を許可するために導入されました。このような文字列の典型的な候補は、ユーザー定義関数のソースコードの断片です。

サンプル

bc(sample)..
`some string value'

ドル記号付きの文字列には、単一の ' 引用符を含めることができます
p.

プリペアドステートメント

CQLは、プリペアドステートメントをサポートしています。プリペアドステートメントは、クエリを一度だけ解析し、異なる具体的な値で複数回実行できるようにする最適化です。

ステートメントでは、列の値が期待されるたびに(データ操作およびクエリステートメント)、代わりに<variable>(上記参照)を使用できます。バインド変数を持つステートメントは、プリペアドである必要があります。プリペアドされた後、バインド変数に具体的な値を指定することで実行できます。ステートメントを準備し、プリペアドステートメントを実行する正確な手順は、使用されるCQLドライバに依存し、このドキュメントの範囲を超えます。

列の値を提供するだけでなく、バインドマーカーを使用してLIMITTIMESTAMP、および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}
AND durable_writes = false;
p.
`CREATE KEYSPACE
ステートメントは、新しいトップレベルのキースペースを作成します。キースペースは、一連のテーブルのレプリケーション戦略といくつかのオプションを定義する名前空間です。有効なキースペース名は、英数字のみで構成され、長さが32以下の識別子です。識別子として、キースペース名は大文字と小文字を区別しないことに注意してください。大文字と小文字を区別するキースペース名には、引用符で囲まれた識別子を使用してください。

CREATE KEYSPACE でサポートされている <properties> は次のとおりです。

名前 種類 必須 デフォルト 説明

レプリケーション

マップ

はい

キースペースに使用するレプリケーション戦略とオプション。

durable_writes

単純

いいえ

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 TABLE
ステートメントは、新しいテーブルを作成します。各テーブルは、そのプロパティを定義する(通常は関連エンティティを表す)のセットです。テーブルは名前で定義され、テーブルの行を構成する列を定義し、多数のオプションがあります。CREATE 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

自由形式の人間が読めるコメント。

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 に設定し、例えば 2 回に 1 回の読み込みをチェックする場合は 0.5 に設定します。

技術的な制限により、現在これは圧縮ファイルに対してのみ適用しています。テーブルで圧縮が有効になっていない場合、チェックサムは検証されません。

コンパクションオプション

compaction プロパティでは、少なくとも、使用するコンパクションストラテジークラスを定義する 'class' サブオプションを定義する必要があります。デフォルトでサポートされているクラスは、'SizeTieredCompactionStrategy''LeveledCompactionStrategy'、および 'TimeWindowCompactionStrategy' です。カスタムストラテジーは、文字列定数としてフルクラス名を指定することで提供できます。残りのサブオプションは、選択したクラスによって異なります。デフォルトクラスでサポートされているサブオプションは次のとおりです。

オプション サポートされているコンパクションストラテジー デフォルト 説明

enabled

all

true

コンパクションを有効にするかどうかを示すブール値。

tombstone_threshold

all

0.2

SSTable に含まれるすべてのカラムに対して、ガベージコレクション可能な墓石の割合がこの比率よりも大きい場合、その SSTable はこれらの墓石をパージする目的で (他の SSTable なしで) コンパクションされます。

tombstone_compaction_interval

all

1 日

SSTable の作成時間後、tombstone compaction を検討するまでの最小待ち時間。ここで、tombstone compaction は、SSTable に tombstone_threshold より多くのガベージコレクション可能な墓石がある場合にトリガーされるコンパクションです。

unchecked_tombstone_compaction

all

false

これを true に設定すると、より積極的な墓石コンパクションが有効になります。単一の SSTable 墓石コンパクションは、成功する可能性をチェックせずに実行されます。

min_sstable_size

SizeTieredCompactionStrategy

50MB

サイズ階層化ストラテジーは、コンパクションする SSTable をバケットにグループ化します。バケットは、サイズが 50% 未満異なる SSTable をグループ化します。ただし、小さいサイズの場合、これは細かすぎるバケット分割になります。min_sstable_size は、すべての SSTable が 1 つの一意のバケットに属するようになる、サイズしきい値 (バイト単位) を定義します。

min_threshold

SizeTieredCompactionStrategy

4

マイナーコンパクションを開始するために必要な SSTable の最小数。

max_threshold

SizeTieredCompactionStrategy

32

1 つのマイナーコンパクションで処理される SSTable の最大数。

bucket_low

SizeTieredCompactionStrategy

0.5

サイズ階層化では、SSTable のサイズが [average_size * bucket_low, average_size * bucket_high] の範囲内にある場合、それらは同じバケット内にあるとみなされます (つまり、デフォルトでは、サイズが最大 50% 異なる SSTable をグループ化します)。

bucket_high

SizeTieredCompactionStrategy

1.5

サイズ階層化では、SSTable のサイズが [average_size * bucket_low, average_size * bucket_high] の範囲内にある場合、それらは同じバケット内にあるとみなされます (つまり、デフォルトでは、サイズが最大 50% 異なる SSTable をグループ化します)。

sstable_size_in_mb

LeveledCompactionStrategy

5MB

レベル化ストラテジーにおける SSTable の目標サイズ (MB 単位)。SSTable のサイズは sstable_size_in_mb 以下である必要がありますが、コンパクション中に特定のパーティションキーのデータが 2 つの SSTable に分割されることはないため、例外的に SSTable が大きくなる可能性があります。

timestamp_resolution

TimeWindowCompactionStrategy

MICROSECONDS

データの挿入時に使用されるタイムスタンプの分解能 (MILLISECONDS、MICROSECONDS など、Java TimeUnit で理解できる必要があります) - USING TIMESTAMP を使用して (またはクライアントで直接同等のものを使用して) 変異を行わない限り、これは変更しないでください。

compaction_window_unit

TimeWindowCompactionStrategy

DAYS

ウィンドウサイズに使用される Java TimeUnit。compaction_window_size と組み合わせて設定します。DAYS、HOURS、MINUTES のいずれかである必要があります。

compaction_window_size

TimeWindowCompactionStrategy

1

時間ウィンドウを構成する compaction_window_unit ユニットの数。

unsafe_aggressive_sstable_expiration

TimeWindowCompactionStrategy

false

期限切れの SSTable は、そのデータが他の SSTable をシャドーイングしているかどうかをチェックせずに削除されます。これは、単一の SSTable コンパクションに対して unchecked_tombstone_compaction が行うことを超えて、データの損失や削除されたデータの再出現につながる可能性のあるリスクの高いオプションです。リスクがあるため、jvm も -Dcassandra.unsafe_aggressive_sstable_expiration=true で起動する必要があります。

圧縮オプション

compression プロパティには、次のサブオプションを使用できます。

オプション デフォルト 説明

class

LZ4Compressor

使用する圧縮アルゴリズム。デフォルトのコンプレッサーは、LZ4Compressor、SnappyCompressor、および DeflateCompressor です。圧縮を無効にするには、'enabled' : false を使用します。カスタムコンプレッサーは、文字列定数としてフルクラス名を指定することで提供できます。

enabled

true

デフォルトでは、圧縮は有効になっています。無効にするには、enabledfalse に設定します。

chunk_length_in_kb

64KB

ディスク上の SSTable はブロック単位で圧縮されます (ランダム読み取りを可能にするため)。これは、上記のブロックのサイズ (KB 単位) を定義します。値が大きいほど圧縮率が向上する可能性がありますが、読み取りのためにディスクから読み取るデータの最小サイズが増加します。

キャッシングオプション

caching プロパティには、次のサブオプションを使用できます。

オプション デフォルト 説明

keys

ALL

このテーブルのキー (`キーキャッシュ'') をキャッシュするかどうか。有効な値は、ALLNONE です。

rows_per_partition

NONE

パーティションごとにキャッシュする行数 (`行キャッシュ'')。整数 `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 = A most excellent and useful column family';
p.
`ALTER
ステートメントは、テーブル定義を操作するために使用されます。新しいカラムの追加、既存のカラムの削除、またはテーブルオプションの更新が可能です。テーブル作成の場合と同様に、ALTER COLUMNFAMILYALTER 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 COLUMNFAMILYDROP 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';
p.
CREATE MATERIALIZED VIEWステートメントは、新しいマテリアライズドビューを作成します。このような各ビューは、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は、ユーザー定義関数を作成または置換します。

関数シグネチャ

シグネチャは、個々の関数を区別するために使用されます。シグネチャは以下で構成されます。

  1. 完全修飾関数名 - つまり、*キースペース*と*関数名*

  2. すべての引数型を連結したリスト

キースペース名、関数名、および引数型は、デフォルトの命名規則と大文字と小文字の区別規則に従うことに注意してください。

オプションのOR REPLACEキーワードを使用したCREATE FUNCTIONは、関数を作成するか、同じシグネチャを持つ既存の関数を置き換えます。同じシグネチャの関数が既に存在する場合、OR REPLACEなしのCREATE FUNCTIONは失敗します。

null値を使用した呼び出し時の動作は、各関数に対して定義する必要があります。2つのオプションがあります。

  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 REPLACE を指定しない CREATE AGGREGATE は、同じシグネチャのアグリゲートが既に存在する場合は失敗します。

オプションの IF NOT EXISTS キーワードを指定した CREATE AGGREGATE は、アグリゲートが存在しない場合に作成します。

OR REPLACEIF 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 のすべての更新は、アトミックかつ分離して適用されます。

利用可能な <option> については、UPDATE のセクションを、<collection-literal> の使用については、コレクションのセクションを参照してください。また、INSERT はカウンターをサポートしていませんが、UPDATE はサポートしていることに注意してください。

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';
p.
`UPDATE`
ステートメントは、テーブル内の特定の行に対して1つ以上の列を書き込みます。 `<where-clause>` は、更新する行を選択するために使用され、 `PRIMARY KEY` を構成するすべての列を含める必要があります。その他の列の値は、 `SET` キーワードの後の `<assignment>` を介して指定されます。

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ステートメントは、複数の変更ステートメント(挿入/更新および削除)を単一のステートメントにグループ化します。これにはいくつかの目的があります。

  1. 複数の更新をバッチ処理する場合、クライアントとサーバー間(および場合によってはサーバーコーディネーターとレプリカ間)のネットワークラウンドトリップを節約します。

  2. 特定のパーティションキーに属するBATCH内のすべての更新は、分離して実行されます。

  3. デフォルトでは、バッチ内のすべての操作はLOGGEDとして実行され、すべての変更が最終的に完了すること(または何も完了しないこと)を保証します。詳細については、UNLOGGEDに関する注記を参照してください。

注意点

  • BATCHステートメントには、UPDATEINSERT、およびDELETEステートメントのみを含めることができます。

  • バッチは、SQLトランザクションの完全な類似物ではありません

  • 各操作にタイムスタンプが指定されていない場合、すべての操作は同じタイムスタンプで適用されます。タイムスタンプの競合の場合のCassandraの競合解決手順により、操作はBATCHステートメントにリストされている順序とは異なる順序で適用される場合があります。特定の操作順序を強制するには、操作ごとのタイムスタンプを指定する必要があります。

UNLOGGED

デフォルトでは、Cassandraはバッチログを使用して、バッチ内のすべての操作が最終的に完了するか、何も完了しないことを保証します(ただし、操作は単一のパーティション内でのみ分離されることに注意してください)。

バッチが複数のパーティションにまたがる場合、バッチの原子化にはパフォーマンスペナルティがあります。このペナルティを発生させたくない場合は、UNLOGGEDオプションを使用して、Cassandraにバッチログをスキップするように指示できます。UNLOGGEDオプションが使用されている場合、失敗したバッチではパッチが部分的にのみ適用される可能性があります。

COUNTER

バッチ処理されたカウンター更新には、COUNTERオプションを使用します。Cassandraの他の更新とは異なり、カウンター更新はべき等ではありません。

<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_at2012-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 COLUMNSIN句にも使用できます。

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

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でのロール管理はプラグ可能であり、カスタム実装ではリストされたオプションのサブセットのみがサポートされる場合があります。

ロール名に英数字以外の文字が含まれる場合は、引用符で囲む必要があります。

内部認証用の資格情報の設定

内部認証のパスワードを設定するには、WITH PASSWORD句を使用し、パスワードを単一引用符で囲みます。
内部認証が設定されていない場合、またはロールにLOGIN権限がない場合、WITH PASSWORD句は不要です。

ロールの条件付き作成

既存のロールを作成しようとすると、IF NOT EXISTSオプションを使用しない限り、無効なクエリ条件になります。オプションが使用され、ロールが存在する場合、ステートメントは何も実行しません。

bc(sample).
CREATE ROLE other_role;
CREATE ROLE IF NOT EXISTS other_role;

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ロールを取り消します。alicereport_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).
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が使用されている場合を除き、ステートメントはエラーを返します。この場合、操作は何も実行しません。

DROP USER

構文

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

サンプル

bc(sample).
DROP USER alice;
DROP USER IF EXISTS bob;

LIST USERS

構文

bc(syntax).
::= LIST USERS;

サンプル

bc(sample).
LIST USERS;

このステートメントは以下と同等ですが

bc(sample).
LIST ROLES;

ただし、LOGIN権限を持つロールのみが出力に含まれます。

データベースID

ADD IDENTITY

構文

bc(syntax)..
::= ADD IDENTITY ( IF NOT EXISTS )? TO ROLE ?

サンプル

bc(sample).
ADD IDENTITY 'id1' TO ROLE 'role1';

ロールを追加する権限を持つユーザーのみがIDを追加できます。

ロール名とID名に英数字以外の文字が含まれる場合は、引用符で囲む必要があります。

条件付きでIDを追加する

IF NOT EXISTSオプションを使用しない限り、既存のIDを追加しようとすると、無効なクエリ条件になります。オプションが使用され、IDが存在する場合、ステートメントは何も行いません。

bc(sample).
ADD IDENTITY IF NOT EXISTS 'id1' TO ROLE 'role1';

DROP IDENTITY

構文

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

サンプル

bc(sample).
DROP IDENTITY 'testIdentity';
DROP IDENTITY IF EXISTS 'testIdentity';

ロールを削除する権限を持つユーザーのみがIDを削除できます。

IF EXISTSオプションを使用しない限り、存在しないIDを削除しようとすると、無効なクエリ条件になります。オプションが使用され、IDが存在しない場合、ステートメントは何も行いません。

データ制御

権限

リソースに対する権限はロールに付与されます。Cassandraにはいくつかの異なるタイプのリソースがあり、各タイプは階層的にモデル化されています。

  • データリソース、キースペース、テーブルの階層構造は、ALL KEYSPACESKEYSPACETABLE です。

  • 関数リソースの構造は、ALL FUNCTIONSKEYSPACEFUNCTION です。

  • ロールを表すリソースの構造は、ALL ROLESROLE です。

  • MBeans/MXBeansのセットにマップされるJMX ObjectNamesを表すリソースの構造は、ALL MBEANSMBEAN です。

権限は、これらの階層の任意のレベルで付与でき、下位に流れます。したがって、チェーンの上位にあるリソースに対する権限を付与すると、自動的に下位にあるすべてのリソースに同じ権限が付与されます。たとえば、KEYSPACESELECT を付与すると、その KEYSPACE 内のすべての TABLES で自動的に付与されます。同様に、ALL FUNCTIONS に対する権限を付与すると、どのキースペースにスコープされているかに関係なく、定義されたすべての関数に付与されます。特定のキースペースにスコープされたすべての関数に権限を付与することも可能です。

権限の変更は、既存のクライアントセッションに表示されます。つまり、権限の変更後に接続を再確立する必要はありません。

利用可能な権限の完全なセットは次のとおりです。

  • CREATE

  • ALTER

  • DROP

  • SELECT

  • MODIFY

  • AUTHORIZE

  • DESCRIBE

  • EXECUTE

  • UNMASK

  • SELECT_MASKED

すべての権限がすべてのタイプのリソースに適用できるわけではありません。たとえば、EXECUTE は関数または mbeans のコンテキストでのみ関連します。テーブルを表すリソースに EXECUTE を付与するのは無意味です。適用できないリソースに対して GRANT 権限を付与しようとすると、エラー応答が発生します。以下に、どの権限をどのタイプのリソースに付与できるか、およびその権限によって有効になるステートメントを示します。

権限 リソース 操作

CREATE

ALL KEYSPACES

CREATE KEYSPACE <br>任意のキースペースでのCREATE TABLE

CREATE

KEYSPACE

指定されたキースペースでのCREATE TABLE

CREATE

ALL FUNCTIONS

任意のキースペースでのCREATE FUNCTION <br>任意のキースペースでのCREATE AGGREGATE

CREATE

ALL FUNCTIONS IN KEYSPACE

キースペースでのCREATE FUNCTION <br>キースペースでのCREATE AGGREGATE

CREATE

ALL ROLES

CREATE ROLE

ALTER

ALL KEYSPACES

ALTER KEYSPACE <br>任意のキースペースでのALTER TABLE

ALTER

KEYSPACE

ALTER KEYSPACE <br>キースペースでのALTER TABLE

ALTER

TABLE

ALTER TABLE

ALTER

ALL FUNCTIONS

既存のものを置き換えるCREATE FUNCTION <br>既存のものを置き換えるCREATE AGGREGATE

ALTER

ALL FUNCTIONS IN KEYSPACE

キースペース内の既存のものを置き換えるCREATE FUNCTION <br>キースペース内の既存のものを置き換えるCREATE AGGREGATE

ALTER

FUNCTION

既存のものを置き換えるCREATE FUNCTION <br>既存のものを置き換えるCREATE AGGREGATE

ALTER

ALL ROLES

任意のロールに対するALTER ROLE

ALTER

ROLE

ALTER ROLE

DROP

ALL KEYSPACES

DROP KEYSPACE <br>任意のキースペースでのDROP TABLE

DROP

KEYSPACE

指定されたキースペースでのDROP TABLE

DROP

TABLE

DROP TABLE

DROP

ALL FUNCTIONS

任意のキースペースでのDROP FUNCTION <br>任意の既存のDROP AGGREGATE

DROP

ALL FUNCTIONS IN KEYSPACE

キースペースでのDROP FUNCTION <br>既存のDROP AGGREGATE

DROP

FUNCTION

DROP FUNCTION

DROP

ALL ROLES

任意のロールに対するDROP ROLE

DROP

ROLE

DROP ROLE

SELECT

ALL KEYSPACES

任意のテーブルに対するSELECT

SELECT

KEYSPACE

キースペース内の任意のテーブルに対するSELECT

SELECT

TABLE

指定されたテーブルに対するSELECT

SELECT

ALL MBEANS

任意のmbeanに対するgetterメソッドの呼び出し

SELECT

MBEANS

ワイルドカードパターンに一致する任意のmbeanに対するgetterメソッドの呼び出し

SELECT

MBEAN

名前付きのmbeanに対するgetterメソッドの呼び出し

MODIFY

ALL KEYSPACES

任意のテーブルに対するINSERT <br>任意のテーブルに対するUPDATE <br>任意のテーブルに対するDELETE <br>任意のテーブルに対するTRUNCATE

MODIFY

KEYSPACE

キースペース内の任意のテーブルに対するINSERT <br>キースペース内の任意のテーブルに対するUPDATE <br>キースペース内の任意のテーブルに対するDELETE <br>キースペース内の任意のテーブルに対するTRUNCATE

MODIFY

TABLE

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

MODIFY

ALL MBEANS

任意のmbeanに対するsetterメソッドの呼び出し

MODIFY

MBEANS

ワイルドカードパターンに一致する任意のmbeanに対するsetterメソッドの呼び出し

MODIFY

MBEAN

名前付きのmbeanに対するsetterメソッドの呼び出し

AUTHORIZE

ALL KEYSPACES

任意のテーブルに対するGRANT PERMISSION <br>任意のテーブルに対するREVOKE PERMISSION

AUTHORIZE

KEYSPACE

キースペース内のテーブルに対するGRANT PERMISSION <br>キースペース内のテーブルに対するREVOKE PERMISSION

AUTHORIZE

TABLE

GRANT PERMISSION <br> REVOKE PERMISSION

AUTHORIZE

ALL FUNCTIONS

任意の関数に対するGRANT PERMISSION <br>任意の関数に対するREVOKE PERMISSION

AUTHORIZE

ALL FUNCTIONS IN KEYSPACE

キースペースでのGRANT PERMISSION <br>キースペースでのREVOKE PERMISSION

AUTHORIZE

ALL FUNCTIONS IN KEYSPACE

キースペースでのGRANT PERMISSION <br>キースペースでのREVOKE PERMISSION

AUTHORIZE

FUNCTION

GRANT PERMISSION <br> REVOKE PERMISSION

AUTHORIZE

ALL MBEANS

任意のmbeanに対するGRANT PERMISSION <br>任意のmbeanに対するREVOKE PERMISSION

AUTHORIZE

MBEANS

ワイルドカードパターンに一致する任意のmbeanに対するGRANT PERMISSION <br>ワイルドカードパターンに一致する任意のmbeanに対するREVOKE PERMISSION

AUTHORIZE

MBEAN

名前付きのmbeanに対するGRANT PERMISSION <br>名前付きのmbeanに対するREVOKE PERMISSION

AUTHORIZE

ALL ROLES

GRANT ROLE 任意のロールの付与 <br>REVOKE ROLE 任意のロールの取り消し

AUTHORIZE

ROLES

GRANT ROLE ロールの付与 <br>REVOKE ROLE ロールの取り消し

DESCRIBE

ALL ROLES

LIST ROLES すべてのロール、または別の指定されたロールに付与されたロールのみ

DESCRIBE

@ALL MBEANS

プラットフォームのMBeanServerから任意のmbeanに関するメタデータを取得する

DESCRIBE

@MBEANS

プラットフォームのMBeanServerからワイルドカードパターンに一致する任意のmbeanに関するメタデータを取得する

DESCRIBE

@MBEAN

プラットフォームのMBeanServerから名前付きのmbeanに関するメタデータを取得する

EXECUTE

ALL FUNCTIONS

SELECTINSERTUPDATE で任意の関数を使用 <br> CREATE AGGREGATE で任意の関数を使用

EXECUTE

ALL FUNCTIONS IN KEYSPACE

SELECTINSERTUPDATE でキースペース内の任意の関数を使用 <br> CREATE AGGREGATE でキースペース内の任意の関数を使用

EXECUTE

FUNCTION

SELECTINSERTUPDATE で関数を使用 <br> CREATE AGGREGATE で関数を使用

EXECUTE

ALL MBEANS

任意のmbeanに対する操作の実行

EXECUTE

MBEANS

ワイルドカードパターンに一致する任意のmbeanに対する操作の実行

EXECUTE

MBEAN

名前付きのmbeanに対する操作の実行

UNMASK

ALL KEYSPACES

任意のテーブルのマスクされた列のクリアな内容を表示

UNMASK

KEYSPACE

キースペース内の任意のテーブルのマスクされた列のクリアな内容を表示

UNMASK

TABLE

指定されたテーブルのマスクされた列のクリアな内容を表示

SELECT_MASKED

ALL KEYSPACES

任意のテーブルのマスクされた列を制限したSELECT

SELECT_MASKED

KEYSPACE

指定されたキースペース内の任意のテーブルのマスクされた列を制限したSELECT

SELECT_MASKED

TABLE

指定されたテーブルのマスクされた列を制限したSELECT

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キースペース内のすべてのテーブルでUPDATEINSERTUPDATEDELETE、およびTRUNCATEクエリを実行する権限が付与されます。

bc(sample).
GRANT DROP ON keyspace1.table1 TO schema_owner;

これにより、schema_ownerロールを持つすべてのユーザーに、keyspace1.table1DROP する権限が付与されます。

bc(sample).
GRANT EXECUTE ON FUNCTION keyspace1.user_function( int ) TO report_writer;

これにより、report_writerロールを持つすべてのユーザーに、関数 keyspace1.user_function( int )を使用する SELECTINSERT、およびUPDATE クエリを実行する権限が付与されます。

bc(sample).
GRANT DESCRIBE ON ALL ROLES TO role_admin;

これにより、role_adminロールを持つすべてのユーザーに、LIST ROLESステートメントを使用してシステム内のすべてのロールを表示する権限が付与されます。

GRANT ALL

GRANT ALL 形式を使用すると、ターゲットリソースに基づいて適切な権限セットが自動的に決定されます。

自動付与

CREATE KEYSPACECREATE TABLECREATE FUNCTIONCREATE AGGREGATE、またはCREATE ROLEステートメントを介してリソースが作成されると、作成者(ステートメントを発行するデータベースユーザーとして識別されるロール)は、新しいリソースに対するすべての適用可能な権限を自動的に付与されます。

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 に適用できるリソース階層の上位にあるすべての権限も含まれます。たとえば、bobkeyspace1 に対する 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

文字列

ASCII 文字列

bigint

integers

64ビット符号付き長整数

blob

blobs

任意のバイト列(検証なし)

boolean

ブール値

true または false

counter

integers

カウンター列(64ビット符号付き値)。詳細についてはカウンターを参照してください。

date

整数、文字列

日付(対応する時間値なし)。詳細については、以下の日付の操作を参照してください。

decimal

整数、浮動小数点数

可変精度10進数

double

integers

64ビットIEEE-754浮動小数点数

float

整数、浮動小数点数

32ビットIEEE-754浮動小数点数

inet

文字列

IPアドレス。4バイト長(IPv4)または16バイト長(IPv6)のいずれかになります。inet定数はありません。IPアドレスは文字列として入力する必要があります。

int

integers

32ビット符号付き整数

smallint

integers

16ビット符号付き整数

text

文字列

UTF8エンコードされた文字列

time

整数、文字列

ナノ秒精度の時間。詳細については、以下の時間の操作を参照してください。

timestamp

整数、文字列

タイムスタンプ。文字列定数を使用して、日付としてタイムスタンプを入力できます。詳細については、以下のタイムスタンプの操作を参照してください。

timeuuid

uuids

タイプ1 UUID。これは一般的に「コンフリクトフリー」のタイムスタンプとして使用されます。Timeuuidに関する関数も参照してください。

tinyint

integers

8ビット符号付き整数

uuid

uuids

タイプ1またはタイプ4 UUID

varchar

文字列

UTF8エンコードされた文字列

varint

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はINSERTUPDATEの両方で許可されていますが、どちらの場合でも、設定された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

ascii

textvarchar

bigint

tinyintsmallintintfloatdoubledecimalvarinttextvarchar

boolean

textvarchar

counter

tinyintsmallintintbigintfloatdoubledecimalvarinttextvarchar

date

timestamp

decimal

tinyintsmallintintbigintfloatdoublevarinttextvarchar

double

tinyintsmallintintbigintfloatdecimalvarinttextvarchar

float

tinyintsmallintintbigintdoubledecimalvarinttextvarchar

inet

textvarchar

int

tinyintsmallintbigintfloatdoubledecimalvarinttextvarchar

smallint

tinyintintbigintfloatdoubledecimalvarinttextvarchar

time

textvarchar

timestamp

datetextvarchar

timeuuid

timestampdatetextvarchar

tinyint

tinyintsmallintintbigintfloatdoubledecimalvarinttextvarchar

uuid

textvarchar

varint

tinyintsmallintintbigintfloatdoubledecimaltextvarchar

変換は、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になります。

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')

は、timeuuidt2013-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で指定されているTime-Based UUID生成プロセスを尊重していないためです。特に、これらの2つのメソッドによって返される値は一意ではありません。これは、これらのメソッドをクエリ(上記の例のように)にのみ使用する必要があることを意味します。これらのメソッドの結果を挿入することは、ほぼ間違いなく悪い考えです。

時間変換関数

timeuuidtimestamp、または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でサポートされているすべての<native-type>typeについて(明らかな理由でblobは例外です)、関数type_as_blobtype型の引数を取り、それをblobとして返します。逆に、関数blob_as_typeは64ビットのblob引数を取り、それをbigint値に変換します。たとえば、bigint_as_blob(3)0x0000000000000003であり、blob_as_bigint(0x0000000000000003)3です。

集計

集計関数は、行のセットに対して機能します。各行の値を受け取り、セット全体に対して1つの値を返します。
通常列、スカラー関数UDTフィールド、writetimemaxwritetime、またはttlが集計関数とともに選択されている場合、それらに対して返される値は、クエリに一致する最初の行の値になります。

CQL3では、組み込み集計(いわゆる「ネイティブ集計」)とユーザー定義集計を区別します。CQL3には、以下に示すいくつかのネイティブ集計が含まれています。

カウント

count関数を使用すると、クエリによって返された行をカウントできます。例

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

また、指定された列のnull以外の値をカウントするためにも使用できます。例

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

最大と最小

max関数とmin関数を使用すると、指定された列に対してクエリによって返される最大値と最小値を計算できます。

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は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''); ;

ユーザー定義関数は、SELECTINSERT、およびUPDATEステートメントで使用できます。

暗黙的に利用可能な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 FUNCTIONDROP FUNCTIONを参照してください。

ユーザー定義集約

ユーザー定義集約を使用すると、UDFを使用してカスタム集約関数を作成できます。集約関数の一般的な例は、countmin、および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 AGGREGATEDROP 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())のデータを返すときに使用する形式について説明しています。

受け入れられる形式 返される形式 備考

ascii

文字列

文字列

JSONの\u文字エスケープを使用します

bigint

整数、文字列

整数

文字列は有効な64ビット整数である必要があります

blob

文字列

文字列

文字列は、0xとそれに続く偶数の16進数で始まる必要があります

boolean

ブール値、文字列

boolean

文字列はtrue''またはfalse''である必要があります

date

文字列

文字列

YYYY-MM-DD形式の日付、タイムゾーンUTC

decimal

整数、浮動小数点、文字列

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句内、またはUPDATEDELETE、またはSELECTステートメントの列値のいずれかとしてのみ使用できます。たとえば、SELECTステートメントの選択句では使用できません。

to_json()関数

to_json()関数は、SELECT JSONと同様に使用できますが、単一の列値に対して使用できます。SELECTステートメントの選択句でのみ使用できます。

付録A:CQLキーワード

CQLは、予約済キーワードと非予約済キーワードを区別します。予約済キーワードは識別子として使用できません。これらは言語用に予約されています(ただし、予約済キーワードを二重引用符で囲むと、識別子として使用できます)。ただし、非予約済キーワードは、特定のコンテキストでのみ特定の意味を持ちますが、それ以外の場合は識別子として使用できます。これらの非予約済キーワードの唯一の存在理由は、利便性です。一部のキーワードは、パーサーがキーワードとして使用されているかどうかを常に簡単に判断できた場合、非予約済になります。

キーワード 予約済?

ADD

はい

AGGREGATE

いいえ

ALL

いいえ

ALLOW

はい

ALTER

はい

AND

はい

APPLY

はい

AS

いいえ

ASC

はい

ASCII

いいえ

AUTHORIZE

はい

BATCH

はい

BEGIN

はい

BIGINT

いいえ

BLOB

いいえ

BOOLEAN

いいえ

BY

はい

CALLED

いいえ

CAST

いいえ

CLUSTERING

いいえ

COLUMNFAMILY

はい

COMPACT

いいえ

CONTAINS

いいえ

COUNT

いいえ

COUNTER

いいえ

CREATE

はい

CUSTOM

いいえ

DATE

いいえ

DECIMAL

いいえ

DEFAULT

はい

DELETE

はい

DESC

はい

DESCRIBE

はい

DISTINCT

いいえ

DOUBLE

いいえ

DROP

はい

DURATION

いいえ

ENTRIES

はい

EXECUTE

はい

EXISTS

いいえ

FILTERING

いいえ

FINALFUNC

いいえ

FLOAT

いいえ

FROM

はい

FROZEN

いいえ

FULL

はい

FUNCTION

いいえ

FUNCTIONS

いいえ

GRANT

はい

GROUP

いいえ

IF

はい

IN

はい

INDEX

はい

INET

いいえ

INFINITY

はい

INITCOND

いいえ

INPUT

いいえ

INSERT

はい

INT

いいえ

INTO

はい

IS

はい

JSON

いいえ

KEY

いいえ

KEYS

いいえ

KEYSPACE

はい

KEYSPACES

いいえ

LANGUAGE

いいえ

LIKE

いいえ

LIMIT

はい

LIST

いいえ

LOGIN

いいえ

MAP

いいえ

MASKED

いいえ

MATERIALIZED

はい

MBEAN

はい

MBEANS

はい

MODIFY

はい

NAN

はい

NOLOGIN

いいえ

NORECURSIVE

はい

NOSUPERUSER

いいえ

NOT

はい

NULL

はい

OF

はい

ON

はい

OPTIONS

いいえ

OR

はい

ORDER

はい

PARTITION

いいえ

PASSWORD

いいえ

PER

いいえ

PERMISSION

いいえ

PERMISSIONS

いいえ

PRIMARY

はい

RENAME

はい

REPLACE

はい

RETURNS

いいえ

REVOKE

はい

ROLE

いいえ

ROLES

いいえ

SCHEMA

はい

SELECT

はい

SELECT_MASKED

いいえ

SET

はい

SFUNC

いいえ

SMALLINT

いいえ

STATIC

いいえ

STORAGE

いいえ

STYPE

いいえ

SUPERUSER

いいえ

TABLE

はい

TEXT

いいえ

TIME

いいえ

TIMESTAMP

いいえ

TIMEUUID

いいえ

TINYINT

いいえ

TO

はい

TOKEN

はい

TRIGGER

いいえ

TRUNCATE

はい

TTL

いいえ

TUPLE

いいえ

TYPE

いいえ

UNLOGGED

はい

UNMASK

いいえ

UNSET

はい

UPDATE

はい

USE

はい

USER

いいえ

USERS

いいえ

USING

はい

UUID

いいえ

VALUES

いいえ

VARCHAR

いいえ

VARINT

いいえ

VIEW

はい

WHERE

はい

WITH

はい

WRITETIME

いいえ

付録B:CQL予約済型

次の型名は現在CQLで使用されていませんが、将来の使用のために予約されています。ユーザー定義型は、予約済の型名をその名前として使用することはできません。

bitstring

byte

complex

date

enum

interval

macaddr

変更点

以下は、CQLの各バージョンにおける変更点について説明します。

3.4.3

3.4.2

  • コレクションの要素およびスライスを選択する機能のサポート(CASSANDRA-7396)。

3.4.2

  • INSERT/UPDATE optionsで、default_time_to_liveが指定されているテーブルに対してTTLを0に指定すると、挿入または更新された値からTTLが削除されます。

  • ALTER TABLEADD および 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.1

  • TRUNCATE TABLE X という構文が、TRUNCATE X のエイリアスとして受け入れられるようになりました。

3.3.0

  • 新しい 集計関数を追加しました。

  • ユーザー定義関数が、CREATE FUNCTION および DROP FUNCTION を通じてサポートされるようになりました。

  • ユーザー定義集計関数が、CREATE AGGREGATE および DROP AGGREGATE を通じてサポートされるようになりました。

  • シングルクォートで囲まれた文字列の代替として、ダラー記号で囲まれた文字列リテラルを許可します。

  • ユーザーベースの認証およびアクセス制御に代わるロールを導入しました。

  • Date および Time データ型が追加されました。

  • JSON のサポートが追加されました。

  • Tinyint および Smallint データ型が追加されました。

  • 新しい時間変換関数を追加し、dateOf および unixTimestampOf を非推奨にしました。Time conversion functions を参照してください。

3.2.0

  • ユーザー定義型が、CREATE TYPEALTER 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 TABLEDROP オプションが、CQL3 テーブルで再び有効になり、新しいセマンティクスを持つようになりました。削除された列によって以前使用されていたスペースは、最終的に(コンパクション後に)再利用されます。マイクロ秒精度のタイムスタンプを使用しない限り、以前に削除した列を再追加しないでください(詳細については、CASSANDRA-3919を参照してください)。

  • SELECT ステートメントが、select 句でエイリアスをサポートするようになりました。WHERE および ORDER BY 句でのエイリアスはサポートされていません。詳細については、select に関するセクションを参照してください。

  • KEYSPACETABLE、および INDEXCREATE ステートメントが、IF NOT EXISTS 条件をサポートするようになりました。同様に、DROP ステートメントは IF EXISTS 条件をサポートします。

  • INSERT ステートメントが、オプションで IF NOT EXISTS 条件をサポートし、UPDATEIF 条件をサポートします。

3.0.5

  • SELECTUPDATE、および 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 の操作を支援するために、次の新しいメソッドが追加されました。nowminTimeuuidmaxTimeuuiddateOf、および unixTimestampOf。詳細については、これらのメソッドに関するセクションを参照してください。

  • ``浮動小数点定数''#constants が指数表記をサポートするようになりました。言い換えれば、4.2E10 が有効な浮動小数点値になりました。

バージョニング

CQL言語のバージョニングは、セマンティックバージョニングガイドラインに従います。バージョンはX.Y.Zの形式を取ります。ここで、X、Y、およびZは、それぞれメジャー、マイナー、およびパッチレベルを表す整数値です。CassandraのリリースバージョンとCQL言語バージョンには相関関係はありません。

バージョン 説明

メジャー

下位互換性のない変更が導入された場合、メジャーバージョンを必ず上げる必要があります。これはめったに発生しません。

マイナー

新しいが下位互換性のある機能が導入された場合、マイナーバージョンが増加します。

パッチ

バグが修正された場合、パッチバージョンが増加します。