UPDATE
1つ以上のカラム値を変テーブルの行に変更します。
1つ以上のカラム値を変テーブルの行に変更します。
構文
UPDATE [keyspace_name.]table_name [ USING TTL time_value ] [ [ AND ] USING TIMESTAMP timestamp_value ] SET assignment [ , assignment ... ] WHERE row_specification [ IF EXISTS | IF condition [ AND condition ] ] ;
INSERT
コマンドまたはUPDATE
コマンドを使用してマテリアライズド・ビュー(MV)が含まれたベース・テーブルを変更する場合は、そのベース・テーブルに対するMODIFY
またはALL PERMISSIONS
がユーザーに与えられている必要があります。構文規則 | 説明 |
---|---|
大文字 | リテラル・キーワード。 |
小文字 | リテラル以外。 |
イタリック体 |
変数値。ユーザー定義値と置き換えます。 |
[] |
任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。 |
( ) |
グループ。丸かっこ(( ) )は、選択肢を含むグループを示します。丸かっこは入力しないでください。 |
| |
または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。 |
... |
繰り返し可能。省略記号(... )は、構文要素を必要な回数だけ繰り返すことができることを示します。 |
'Literal string' |
単一引用符( ' )でCQL文内のリテラル文字を囲みます。大文字を維持するには、単一引用符を使用します。 |
{ key : value } |
マップ・コレクション。中かっこ( { } )でマップ・コレクションまたはキーと値のペアを囲みます。コロンでキーと値を区切ります。 |
<datatype1,datatype2> |
セット、リスト、マップ、またはタプル。山かっこ(< > )で、セット、リスト、マップまたはタプル内のデータ型を囲みます。データ型はコンマで区切ります。 |
cql_statement; |
CQL文の終了。セミコロン( ; )ですべてのCQL文を終了します。 |
[--] |
コマンドライン・オプションとコマンド引数は、2つのハイフン(-- )。この構文は、引数がコマンドライン・オプションと間違われる可能性がある場合に役立ちます。 |
' <schema> ... </schema> ' |
検索CQLのみ:単一引用符( ' )でXMLスキーマ宣言全体を囲みます。 |
@xml_entity='xml_entity_type' |
検索CQLのみ:スキーマ・ファイルおよびsolrConfigファイル内のXML要素を上書きするための実体とリテラル値を示します。 |
UPDATEは、1つまたは複数のカラム値をテーブル内の1つの行に書き込みます。INSERTと同様、UPDATEはupsert操作です。指定した行が存在しない場合、行はコマンドによって作成されます。同じパーティション・キー内のUPDATEはすべて、アトミックに独立して適用されます。
USING句は、time to live(TTL)値を行に追加することができます。TTLをカウンター・カラムに適用することはできません。
WHERE句は、更新対象の行を指定します。行を指定するには、WHERE句で行のプライマリ・キーの各カラムの値を指定する必要があります。複数の行を指定するには、INキーワードを使用して使用可能な値のリストを指定します。この方法は、プライマリ・キーの最後のカラムに対してのみ行うことができます。
IF EXISTSが含まれている場合を除き、UPDATEコマンドは結果を返しません。
- keyspace_name
- 更新するテーブルが含まれているキースペースの名前。USEコマンドを使用してそのセッションにキースペースが設定されている場合は必要ありません。
- table_name
- 更新するテーブルの名前。
- time_value
- TTLの値は秒数です。TTLのマークが付いたコマンドのカラム値は、指定の秒数が経過すると、自動的に削除済みのマーク(トゥームストーン)が付きます。TTLはカラム自体ではなく、マークが付いたカラム値に適用されます。カラムのその後の更新で、この値は更新で指定されたTTLにリセットされます。デフォルトでは、値は期限切れになりません。カウンター・カラムのデータのtime_valueを設定することはできません。
テーブルのdefault_time_to_liveプロパティを設定すると、デフォルトのTTLをテーブル全体に設定できます。INSERTまたはUPDATEコマンドを使用してカラムにTTLを設定すると、テーブルTTLはオーバーライドされます。
さらに、
time_value
を0に設定することで、カラムのTTLを削除することができます。警告: 2038年問題のため、データベース・ストレージ・エンジンでは、January 19 2038 03:14:07 UTC
のみをエンコードできます。TTL日付オーバーフローポリシーによって、有効期限が最長の日付よりも後のタイムスタンプの要求を拒否するか、受け入れるかどうかが決定します。-Dcassandra.expiration_date_overflow_policyを参照してください。 - timestamp_value
- TIMESTAMPを使用すると、挿入したカラムにはその値(マイクロ秒単位のタイムスタンプ)のマークが付けられます。TIMESTAMPの値が設定されていない場合は、カラムが更新された時間(マイクロ秒単位)が使用されます。
- assignment
-
既存の要素に値を割り当てます。
以下のいずれかを使用できます。column_name = column_value [, column_name = column_value] . . . | counter_column_name = counter_column_name + | - counter_offset | list_name = ['list_item' [, 'list_item'] . . . ] | list_name = list_name + | - ['list_item' [, 'list_item'] . . . ] | list_name = ['list_item' [, 'list_item'] . . . ] + list_name | map_name = map_name + | - { map_key : map_value [, map_key : map_value . . . } | map_name[ index ] = map_value | set_name = set_name + | - { ['set_item'] }
変数 説明 column_name 更新するカラムの名前。 column_value 指定したカラム名に対して挿入する値。 counter_column_name 更新するカウンター・カラムの名前。 counter_offset 指定したカウンターをインクリメントまたはデクリメントする値(counter_offsetの前に「=」と「-」のどちらが付いているかによって異なります)。 list_name 更新するリストの名前。リストの形式: [list_item , list_item , list_item]
角かっこが使用されていることにご注意ください。
list_item リストに追加する、またはリストから削除する値。 map_name 更新するマップの名前。マップの形式: { key : value , key: value , key: value . . . }
中かっこ({ })が使用されていることにご注意ください。
map_key マップ・エントリーの最初の用語またはキー。 map_value マップ・エントリーの2番目の用語または値。 set_name 更新するセットの名前。セットの形式:{ set_item , set_item , set_item . . . }
中かっこ({ })が使用されていることにご注意ください。
set_item セットに含めるリテラル値。 注: リストとセットの違い:セット内の各項目は一意である必要があります。 - row_specification
WHERE
句は、プライマリ・キーで更新する行を特定する必要があります。- 1行を指定するには、
primary_key_name = primary_key_value
を使用します。プライマリ・キーが要素の組み合わせである場合は、この後にAND primary_key_name = primary_key_value ...
を追加します。WHERE句は、プライマリ・キーのコンポーネントごとに値を指定する必要があります。 - 複数の行を指定するには、
primary_key_name IN ( primary_key_value, primary_key_value … )
を使用します。これはプライマリ・キーの最後のコンポーネントにのみ使用できます。
注: 静的カラムを更新するには、パーティション・キーのみを指定する必要があります。- 1行を指定するには、
- IF EXISTS | IF条件
- レコードを更新する前に検証を実行します(軽量トランザクション)。次のように使用します。
IF EXISTS
:1つ以上の行がクエリーと一致している必要があります。一致する行がない場合、この文は失敗します。UPDATE cycling.cyclist_name SET comment = 'Rides hard, gets along with others, a real winner' WHERE id = fb372533-eb95-4bb4-8685-6ef61e994caa IF EXISTS;
ヒント:IF EXISTS
がないUPDATE文に一致する行がない場合は、新しいレコードが作成されます。IF conditional_statement
:クエリーに一致する行の非プライマリ・キー・カラムをテストします。trueを返した行に更新を適用します。クエリーに一致する行がなく、条件文でNULLをテストする場合は、新しいレコードが挿入されます。UPDATE cycling.cyclist_name SET comment = 'Rides hard, gets along with others, a real winner' WHERE id = fb372533-eb95-4bb4-8685-6ef61e994caa IF comment = NULL;
例
カラムの更新
UPDATE cycling.cyclist_name SET firstname = NULL WHERE id IN ( 5b6962dd-3f90-4c93-8f61-eabfa4a803e2, fb372533-eb95-4bb4-8685-6ef61e994caa );
UPDATE cycling.cyclist_name SET firstname = 'Marianne', lastname = 'VOS' WHERE id = 88b8fd18-b1ed-4e96-bf79-4280797cba80;
タイムスタンプとTTLを使用した更新
set
(またはコレクション)値をタイムスタンプおよびTTLで更新するには、以下のように値を指定します。UPDATE cycling.cyclist_sponsors_expire USING TIMESTAMP 200 AND TTL 20000 SET sponsorship += {'Tag Heuer'} WHERE cyclist_name='PRIETO, Marcela';
カウンター・カラムの更新
UPDATE cycling.popular_count SET popularity = popularity + 2 WHERE id = 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47;
正確を期すため、軽量トランザクションをカウンター・カラムを対象に使うには、1つまたは複数のカウンター更新をバッチ文に含めます。詳細については、「バッチでの条件付き更新の実行」を参照してください。
UPDATEを使用したパーティションの作成
(id)
のcyclists
テーブルに新しいパーティションを作成する場合、そのパーティションがまだ存在しなくてもid e7cd5752-bc0d-4157-a80f-7523add8dbcd
のパーティションをUPDATE(更新)できます。UPDATE cycling.cyclist_name SET firstname = 'Anna', lastname = 'VAN DER BREGGEN' WHERE id = e7cd5752-bc0d-4157-a80f-7523add8dbcd;
リストの更新
UPDATE cycling.upcoming_calendar SET events = ['Criterium du Dauphine','Tour de Suisse'] WHERE year=2015 AND month=06;
UPDATE cycling.upcoming_calendar SET events = ['Tour de France'] + events WHERE year=2015 AND month=06;
UPDATE cycling.upcoming_calendar SET events = events + ['Tour de France'] WHERE year=2017 AND month=05;
UPDATE cycling.upcoming_calendar SET events[2] = 'Tour de France' WHERE year=2015 AND month=06;
UPDATE cycling.upcoming_calendar SET events = events - ['Tour de France'] WHERE year=2015 AND month=06;
ユーザー定義型のコレクション・カラムのデータを更新するには、「ユーザー定義型の使用」で示すように、丸かっこの中で、その型の構成要素を中かっこで囲みます。
set
またはmap
コレクション型の方が更新の際は安全です。セットの更新
UPDATE cycling.cyclist_career_teams SET teams = teams + {'Team DSB - Ballast Nedam'} WHERE id = 5b6962dd-3f90-4c93-8f61-eabfa4a803e2;
UPDATE cycling.cyclist_career_teams SET teams = teams - {'DSB Bank Nederland bloeit'} WHERE id = 5b6962dd-3f90-4c93-8f61-eabfa4a803e2;
UPDATE cycling.cyclist_career_teams SET teams = {} WHERE id = 5b6962dd-3f90-4c93-8f61-eabfa4a803e2;
マップの更新
UPDATE cycling.upcoming_calendar SET description = description + {'Criterium du Dauphine' : 'Easy race'} WHERE year = 2015 AND month = 06 ;
events
という名前のマップ内のカレンダーに新しいレースを追加するなど、特定の要素を更新または設定するには、以下のようにします。UPDATE cycling.upcoming_calendar SET events[2] = 'Vuelta Ciclista a Venezuela' WHERE year = 2015 AND month = 06;
UPDATE cycling.upcoming_calendar USING TTL 10000000 SET events[2] = 'Vuelta Ciclista a Venezuela' WHERE year = 2015 AND month = 06;
UPDATE cycling.upcoming_calendar SET description = description + {'Criterium du Dauphine' : 'Easy race', 'Tour du Suisse' : 'Hard uphill race'} WHERE year = 2015 AND month = 6;
+の代わりに-を使用して、同じようにマップから要素を削除します。
セットとマップを更新する際の注意
CQLでは、別の方法でもセットとマップを更新することができます。これらの方法でも同じタスクを実行できるように見えますが、データベースの処理方法は異なり、その違いは重要です。
UPDATE cycling.upcoming_calendar SET description = {'Criterium du Dauphine' : 'Easy race', 'Tour du Suisse' : 'Hard uphill race'} WHERE year = 2015 AND month = 6;
新しいエントリーをマップに追加する最も簡単な方法は、上記で説明したように+
演算子を使用する方法です。
ここで、最初の2つのエントリーを上書きして新しいエントリーを追加するコマンドを使用して、新しいエントリーを追加してみましょう。
これらの2つの文は同じ処理を行っているように見えます。しかしバックグラウンドでデータベースは、2番目の文を処理する際に、コレクション全体を削除し、3つのエントリーを含む新しいコレクションと置き換えています。この処理により、新しいマップ・コレクション内のエントリーと削除されたエントリーが同一であっても、削除されたエントリーに対してトゥームストーンが作成されます。この方法ですべてのマップ・コレクションを更新すると、多くのトゥームストーンが作成され、システムの処理速度が低下する可能性があります。
上記の例ではマップ・コレクションを使用していますが、セットを更新する際も同じ注意が当てはまります。
非コレクション・フィールドによるUDTの更新
UPDATE cycling.cyclist_stats SET basics.birthday = '2000-12-12' WHERE id = 220844bf-4860-49d6-9a4b-6b5d3a79cbfb;
カラムの条件付き更新
IFまたはIF EXISTSを使用して、条件付きでカラムを更新できます。
UPDATE cycling.cyclist_id SET id = UUID() WHERE lastname = 'WELTEN' AND firstname = 'Bram' AND age = 18 IF EXISTS;
- 行が存在する場合(trueが返ってきた場合)の出力は次のようになります。
[applied] ----------- True
-
行が存在しない場合(falseが返ってきた場合)、コマンドは失敗し、出力は次のようになります。
[applied] ----------- False
一致した行の1つ以上のその他(非プライマリ・キー)のカラム値にテストを適用するには、IF conditionを使用します。
UPDATE cycling.cyclist_id SET id = UUID() WHERE lastname = 'WELTEN' AND firstname = 'Bram' AND age = 18 IF id = 18f471bf-f631-4bc4-a9a2-d6f6cf5ea503;
- レコードが一致し、条件がTRUEを返した場合、更新が適用され、次のような出力になります。
[applied] ----------- True
- レコードが一致し、条件がfalseを返した場合、クエリーは失敗します。出力の例を次に示します。
[applied] | id -----------+-------------------------------------- False | 863e7103-c03b-48c3-a11c-42376aa77291
- レコードが一致せず、条件で
id = 18f471bf-f631-4bc4-a9a2-d6f6cf5ea503
のような非NULL値をテストしている場合は、クエリーも失敗します。
IF
条件でNULL値をテストする場合は次のようになります。UPDATE cycling.cyclist_id SET id = UUID() WHERE lastname = 'Smith' AND firstname = 'Joe' AND age = 22 IF id = NULL;
- レコードは一致したがidカラムに値がない場合、値が挿入される。
- レコードは一致したがidカラムに値(NULL以外)が含まれている場合、文が失敗する。
- 一致するレコードがない場合、新しいレコードが作成される。
バッチでの条件付き更新の実行
UPDATEコマンドを使用すると、一致する行が見つからない場合に新しい行が作成されます。新しい行は、同じBATCHに適用された軽量トランザクションですぐには使用できません。
例を次に示します。
CREATE TABLE cycling.mytable (a int, b int, s int static, d text, PRIMARY KEY (a, b)); BEGIN BATCH INSERT INTO cycling.mytable (a, b, d) values (7, 7, 'a'); UPDATE cycling.mytable SET s = 7 WHERE a = 7 IF s = NULL; APPLY BATCH;
上記の最初のバッチでは、insertコマンドによってプライマリ・キーの値が(7,7)のパーティションが作成されますが、s
カラムの値は設定されません。この行のs
カラムが定義されていなくても、IF s = NULL
条件は成功するため、バッチも成功します(旧バージョンでは条件が失敗し、その障害によりバッチ全体が失敗していました)。