UPDATE
行内のカラムを更新します。
行内のカラムを更新します。
構文
UPDATE keyspace_name.table_name USING option AND option SET assignment, assignment, ...WHERE row_specification IF column_name = literal AND column_name = literal .. . IF EXISTS
optionは以下のいずれかです。
- TIMESTAMP microseconds
- TTL seconds
assignmentは以下のいずれかになります。
column_name = value set_or_list_item = set_or_list_item(+ | -)... map_name = map_name(+ | -)... map_name = map_name(+ | -){ map_key :map_value, ...} column_name [ term ] = value counter_column_name = counter_column_name(+ | -)integer
setは以下のとおりです。
{ literal, literal, . . . }
listは以下のとおりです。
[ literal, literal ]
mapは以下のとおりです。
{ literal :literal, literal :literal, . . . }
termは以下のとおりです。
[ list_index_position | [ key_value ]
row_specificationは以下のとおりです。
primary key name = key_value primary key name IN (key_value ,...)
構文の凡例
- 大文字はリテラルを意味する
- 小文字は、リテラルでないことを意味する
- イタリック体は指定が任意であることを意味する
- パイプ(|)記号はORまたはAND/ORを意味する
- 省略記号(...)は繰り返し可能を意味する
- 範囲記号「(」および「)」はリテラルではなく、範囲を示す
この構文には、CQL文の終了となるセミコロンは含まれていません。
説明
UPDATEは、任意の行の1つまたは複数のカラム値をCassandraテーブルに書き込みます。結果は返されません。文はUPDATEキーワードで始まり、その後にCassandraテーブル名が続きます。
行は、これまでに存在していなければ作成され、存在していれば更新されます。WHERE句内に、パーティション・キーを構成するすべてのカラムを含めることで、更新対象の行を指定します。IN関係はパーティション・キーの最後のカラムでのみサポートされます。UPDATE SET操作は、プライマリ・キー・フィールドでは有効ではありません。SETを使用して他のカラム値を指定します。複数のカラムを更新するには、名前と値のペアをコンマで区切ります。
UPDATE customer_account SET customer_email='lauras@gmail.com' If customer_email='laurass@gmail.com';
IFキーワードに続いて、更新が成功するために満たすべき条件を指定します。IF条件を使用すると、直列化による整合性をサポートするPaxosを内部で使うことに関連した、パフォーマンスへの影響が発生します。UPDATE文では、同じパーティション・キー内のすべての更新がアトミックに、独立して適用されます。カウンター・テーブル内のカウンター・カラム値を更新するには、カウンター・カラムの現在値に対するインクリメントまたはデクリメントを指定します。INSERTコマンドとは異なり、UPDATEコマンドはカウンターをサポートします。それ以外は、更新と挿入の操作は内部で同一になります。
UPDATE UserActionCounts SET total = total + 2 WHERE keyalias = 523;
UPDATE文では、カウンター・カラムではないカラムを対象に以下のオプションを指定できます。
- TTL seconds
- TIMESTAMP microseconds
TTLの指定は秒単位です。要求された時間が経過すると、TTLカラムの値に自動的に削除済みのマーク(トゥームストーン)が付きます。TTLは、カラム自体にではなく、挿入された値に期限を設定します。カラムのその後の更新で、TTLは更新で指定されたTTLにリセットされます。デフォルトでは、値は期限切れになりません。
TIMESTAMP入力はマイクロ秒を表す整数です。指定がなかった場合、カラムに対して発生した書き込みの時刻(ミリ秒単位)が使用されます。各更新文には、WHERE句を使用して指定した正確なプライマリ・キーのセットが必要です。複合カラムおよびクラスタリング・カラムを持っているテーブル内のすべてのキーを指定する必要があります。たとえば、useridとurlからなる複合プライマリ・キー持っているテーブル内のカラム値を更新するには、以下のようにします。
UPDATE excelsior.clicks USING TTL 432000 SET user_name = 'bob' WHERE userid=cfd66ccc-d857-4e90-b1e5-df98a3d40cd6 AND url='http://google.com'; UPDATE Movies SET col1 = val1, col2 = val2 WHERE movieID = key1; UPDATE Movies SET col3 = val3 WHERE movieID IN (key1, key2, key3); UPDATE Movies SET col4 = 22 WHERE movieID = key4;
CQLでは、IN句内に値の空のリストを使用できるため、Javaドライバー・アプリケーションで空の配列を引数としてIN句に渡す場合に役立ちます。
カラム更新の例
一度に複数行内のカラムを更新するには、以下のようにします。
UPDATE users SET state = 'TX' WHERE user_uuid IN (88b8fd18-b1ed-4e96-bf79-4280797cba80, 06a8913c-c0d6-477c-937d-6c1b69a95d43, bc108776-7cb5-477f-917d-869c12dfffa8);
1行内の複数のカラムを更新するには、以下のようにします。
UPDATE users SET name = 'John Smith', email = 'jsmith@cassie.com' WHERE user_uuid = 88b8fd18-b1ed-4e96-bf79-4280797cba80;
カウンター・カラムの更新
数値を加算または減算する数式を代入することで、カウンター・カラムの値を任意の数値で増減することができます。カウンター・カラム値を更新するには、以下の例に示す構文を使用します。
UPDATE counterks.page_view_counts SET counter_value = counter_value + 2 WHERE url_name='www.datastax.com' AND page_name='home';
正確を期すため、軽量トランザクションをカウンター・カラムを対象に使うには、1つまたは複数のカウンター更新をバッチ文に含めます。
コレクション・セットの更新
1つの要素をセットに追加するには、UPDATEコマンドと加算(+)演算子を併用します。
UPDATE users SET emails = emails + {'fb@friendsofmordor.org'} WHERE user_id = 'frodo';
セットから1つの要素を削除するには、減算(-)演算子を使用します。
UPDATE users SET emails = emails - {'fb@friendsofmordor.org'} WHERE user_id = 'frodo';
セットからすべての要素を削除するには、以下のようなUPDATE文を使用します。
UPDATE users SET emails = {} WHERE user_id = 'frodo';
コレクション・マップの更新
マップ・データを設定または置き換えるには、UPDATEコマンドを使用します。たとえば、マップ・コレクション構文内のタイムスタンプおよびテキスト値を、コロンで区切って中かっこで囲みます。
UPDATE users SET todo = { '2012-9-24' :'enter mordor', '2012-10-2 12:00' :'throw ring into mount doom' } WHERE user_id = 'frodo';
また、UPDATEコマンドを使用して、特定の要素を更新または設定できます。たとえば、以下のようにして、10月2日にユーザーfrodoに対して'die'というリマインダーを挿入するよう、todoというマップを更新します。
UPDATE users SET todo['2014-10-2 12:10'] = 'die' WHERE user_id = 'frodo';
各マップ要素にTTLを設定できます。
UPDATE users USING TTL <ttl value> SET todo['2012-10-1'] = 'find water' WHERE user_id = 'frodo';
Cassandra 2.1.1以降では、1つ以上の要素をカンマで区切って追加することで、マップを更新できます。
UPDATE users SET todo = todo + { '2012-10-1':'find water', '2014-12-15':'buy presents' } where user_id = 'frodo';
+の代わりに-を使用しても、同じように要素をマップから削除できます。
コレクション・リストの使用
リストに値を挿入するには、以下のようにします。
UPDATE users SET top_places = [ 'rivendell', 'rohan' ] WHERE user_id = 'frodo';
リストの先頭に1つの要素を追加するには、要素を大かっこで囲み、加算(+)演算子を使用します。
UPDATE users SET top_places = [ 'the shire' ] + top_places WHERE user_id = 'frodo';
リストに1つの要素を追加するには、UPDATEコマンド内の新しい要素データとリスト名の順序を入れ替えます。
UPDATE users SET top_places = top_places + [ 'mordor' ] WHERE user_id = 'frodo';
特定の位置に1つの要素を追加するには、大かっこで囲んだリスト・インデックス位置を使用します。
UPDATE users SET top_places[2] = 'riddermark' WHERE user_id = 'frodo';
特定の値を持つすべての要素を削除するには、UPDATEコマンド、減算演算子(-)、大かっこで囲んだリスト値を使用します。
UPDATE users SET top_places = top_places - ['riddermark'] WHERE user_id = 'frodo';
ユーザー定義型のコレクション・カラムのデータを更新するには、「ユーザー定義型」で示すように、そのユーザー定義型の構成要素を丸かっこで囲み中かっこ内に置きます。