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がユーザーに与えられている必要があります。
1. 凡例
構文規則 説明
大文字 リテラル・キーワード。
小文字 リテラル以外。
イタリック体 変数値。ユーザー定義値と置き換えます。
[] 任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。
( ) グループ。丸かっこ(( ))は、選択肢を含むグループを示します。丸かっこは入力しないでください。
| または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。
... 繰り返し可能。省略記号(...)は、構文要素を必要な回数だけ繰り返すことができることを示します。
'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と同様、UPDATEupsert操作です。指定した行が存在しない場合、行はコマンドによって作成されます。同じパーティション・キー内のUPDATEはすべて、アトミックに独立して適用されます。

USING句は、time to liveTTL)値を行に追加することができます。TTLをカウンター・カラムに適用することはできません。

新しい値をSET句の行のカラムに割り当てます。UPDATEは、行のプライマリ・キー・フィールドの値を更新できません。カウンター・テーブルのカウンターを更新するには、カウンター・カラムに対してインクリメントまたはデクリメントを指定します。
注: INSERTコマンドとは異なり、UPDATEコマンドはカウンターをサポートしています。それ以外は、UPDATEINSERTの操作は同一です。

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 … )を使用します。これはプライマリ・キーの最後のコンポーネントにのみ使用できます。
注: 静的カラムを更新するには、パーティション・キーのみを指定する必要があります。
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;
警告: IF文を使用するとパフォーマンスに影響を及ぼす可能性があります。「linearizable consistency」を参照してください。
たとえば「カラムの条件付き更新」を参照してください。

カラムの更新

一度に複数行内のカラムを更新するには、以下のようにします。
UPDATE cycling.cyclist_name
SET firstname = NULL
WHERE id IN (
  5b6962dd-3f90-4c93-8f61-eabfa4a803e2, fb372533-eb95-4bb4-8685-6ef61e994caa
);
1行内の複数のカラムを更新するには、以下のようにします。
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を使用したパーティションの作成

データベースではUPDATEがupsertとして処理されるので、テーブルの行を更新することで新しい行を作成できます。たとえば、プライマリ・キーが(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;
特定の位置に1つの要素を追加するには、大かっこで囲んだリスト・インデックス位置を使用します。
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;

ユーザー定義型のコレクション・カラムのデータを更新するには、「ユーザー定義型の使用」で示すように、丸かっこの中で、その型の構成要素を中かっこで囲みます。

注意: Javaリスト・インデックスはスレッド・セーフではありません。setまたはmapコレクション型の方が更新の際は安全です。

セットの更新

1つの要素をセットに追加するには、UPDATEコマンドと加算(+)演算子を併用します。
UPDATE cycling.cyclist_career_teams
SET teams = teams + {'Team DSB - Ballast Nedam'} 
WHERE id = 5b6962dd-3f90-4c93-8f61-eabfa4a803e2;
セットから1つの要素を削除するには、減算(-)演算子を使用します。
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;
各マップ要素にTTLを設定するには、以下のようにします。
UPDATE cycling.upcoming_calendar 
USING TTL 10000000
SET events[2] = 'Vuelta Ciclista a Venezuela' 
WHERE year = 2015 AND month = 06;
1つ以上の要素をコンマで区切って追加することで、マップを更新できます。
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では、別の方法でもセットとマップを更新することができます。これらの方法でも同じタスクを実行できるように見えますが、データベースの処理方法は異なり、その違いは重要です。

例を次に示します。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コマンドを使用します。
UPDATE cycling.cyclist_stats 
SET basics.birthday = '2000-12-12' 
WHERE id = 220844bf-4860-49d6-9a4b-6b5d3a79cbfb;

カラムの条件付き更新

IFまたはIF EXISTSを使用して、条件付きでカラムを更新できます。

クエリーが行と一致する場合にのみ更新を追加するには、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を使用します。

この例では、IDが一致する場合にのみ新しいUUIDを設定します。
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条件は成功するため、バッチも成功します(旧バージョンでは条件が失敗し、その障害によりバッチ全体が失敗していました)。