UPDATE

行内のカラムを変更します。

行内のカラムを変更します。

構文

UPDATE [keyspace_name.] table_name
[USING TTL time_value | USING TIMESTAMP timestamp_value]
SET assignment [, assignment] . . . 
WHERE row_specification
[IF EXISTS | IF NOT EXISTS | IF condition [AND condition] . . .]
表 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 Live(TTL)値を行に追加することができます。TTLをカウンター・カラムに適用することはできません。

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

WHERE句は、更新対象の行を指定します。行を指定するには、WHERE句で行のプライマリ・キーの各カラムの値を指定する必要があります。複数の行を指定するには、INキーワードを使用して使用可能な値のリストを指定します。この方法は、プライマリ・キーの最後のカラムに対してのみ行うことができます。

IF EXISTSキーワードまたはIFキーワードを使用すると軽量トランザクションを実装できます。
UPDATE cycling.cyclist_name
SET comments ='='Rides hard, gets along with others, a real winner'
WHERE id = fb372533-eb95-4bb4-8685-6ef61e994caa IF EXISTS;
IFキーワードを使用して、更新が成功するにはTRUEとなる必要がある条件を実装します。IF条件を使用すると、直列化可能な整合性をサポートするためのPaxosの使用に関連したパフォーマンスへの影響が発生します。

IF EXISTSが含まれている場合を除き、UPDATEコマンドは結果を返しません。

keyspace_name
更新するテーブルが含まれているキースペースの名前。USEコマンドを使用してそのセッションにキースペースが設定されている場合は必要ありません。
table_name
更新するテーブルの名前。
time_value
TTLの値は秒数です。TTLのマークが付いたコマンドのカラム値は、指定の秒数が経過すると、自動的に削除済みのマーク(トゥームストーン)が付きます。TTLはカラム自体ではなく、マークが付いたカラム値に適用されます。カラムのその後の更新で、この値は更新で指定されたTTLにリセットされます。デフォルトでは、値は期限切れになりません。カウンター・カラムのデータのtime_valueを設定することはできません。

テーブルのdefault_time_to_liveプロパティを設定すると、デフォルトのTTLをテーブル全体に設定できます。テーブルTTLで定義されている時間を超えるTTLを特定のカラムに設定しようとすると、DataStax Enterpriseでエラーが返されます。

さらに、time_valueを0に設定することで、カラムのTTLを削除することができます。

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 NOT EXISTS | IF condition
IF句はWHERE句に一致する行に対するコマンドのアクションを制限できます。
  • IF EXISTSを使用して、行がWHERE条件に一致する場合はUPDATEが失敗するように指定します。
  • IF NOT EXISTSを使用して、WHERE条件に一致する行がない場合はUPDATEが失敗するように指定します。
  • IFを使用して、指定した行の値がtrueかどうかをテストする条件を1つ以上指定します。
IFを使用すると、標準出力の結果が返されます。たとえば「カラムの条件付き更新」を参照してください。

カラムの更新

一度に複数行内のカラムを更新するには、以下のようにします。

UPDATE users
  SET state = 'TX'
  WHERE user_uuid
  IN (88b8fd18-b1ed-4e96-bf79-4280797cba80,
    06a8913c-c0d6-477c-937d-6c1b69a95d43,
    bc108776-7cb5-477f-917d-869c12dfffa8);
CQLでは、IN句内に値の空のリストを使用できるため、Javaドライバー・アプリケーションで空の配列を引数としてIN句に渡す場合に役立ちます。

1行内の複数のカラムを更新するには、以下のようにします。

UPDATE cycling.cyclists
  SET firstname = 'Marianne,
  lastname = 'VOS'
  WHERE id = 88b8fd18-b1ed-4e96-bf79-4280797cba80;

複雑なプライマリ・キーを使用してテーブル内の行を更新します。

更新するには、複合カラムおよびクラスター化カラムを含むテーブル内のすべてのキーを指定します。たとえば、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;

カウンター・カラムの更新

カウンター・テーブル内のカウンター・カラム値を更新するには、現在値に適用するインクリメントまたはデクリメントを指定します。

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.cyclists
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'];

リストの先頭に要素を書き込むには、要素を角かっこで囲み、加算(+)演算子を使用します。

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[4] = 'Tour de France' WHERE year=2016 AND month=07;

特定の値を持つすべての要素を削除するには、減算演算子(-)を使用し、リスト値を角かっこで囲んで指定します。

UPDATE cycling.upcoming_calendar 
SET events = events - ['Criterium du Dauphine'] WHERE year=2016 AND month=07;

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

注意: 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;

eventsという名前のマップ内のカレンダーに新しいレースを追加するなど、特定の要素を更新または設定するには、以下のようにします。

UPDATE cycling.upcoming_calendar 
SET events[2] = 'Vuelta Ciclista a Venezuela' WHERE year = 2016 AND month = 06;

各マップ要素にTTLを設定するには、以下のようにします。

UPDATE cycling.upcoming_calendar USING TTL <ttl_value>
SET events[2] = 'Vuelta Ciclista a Venezuela' WHERE year = 2016 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;
新しいエントリーをマップに追加する最も簡単な方法は、上記で説明したように+演算子を使用する方法です。
UPDATE cycling.upcoming_calendar 
SET description = description + { 'Tour de France' : 'Very competitive'} 
WHERE year = 2015 AND month = 6;
ここで、最初の2つのエントリーを上書きして新しいエントリーを追加するコマンドを使用して、新しいエントリーを追加してみましょう。
UPDATE cycling.upcoming_calendar 
SET description = 
{'Criterium du Dauphine' : 'Easy race', 
 'Tour du Suisse' : 'Hard uphill race',
 'Tour de France' : 'Very competitive'} 
WHERE year = 2015 AND month = 6;

これらの2つの文は同じ処理を行っているように見えます。しかしバックグラウンドでデータベースは、2番目の文を処理する際に、コレクション全体を削除し、3つのエントリーを含む新しいコレクションと置き換えています。この処理により、新しいマップ・コレクション内のエントリーと削除されたエントリーが同一であっても、削除されたエントリーに対してトゥームストーンが作成されます。この方法ですべてのマップ・コレクションを更新すると、多くのトゥームストーンが作成され、システムの処理速度が低下する可能性があります。

上記の例ではマップ・コレクションを使用していますが、セットを更新する際も同じ注意が当てはまります。

非コレクション・フィールドによるUDTの更新

DataStax Enterprise 5.1以降では、ユーザー定義型の個々のフィールド値を非コレクション・フィールドで変更する場合、UPDATEコマンドを使用します。

UPDATE 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 age = 28 WHERE lastname = 'WELTEN' and firstname = 'Bram' IF EXISTS;

IF EXISTSを使用しない場合、コマンドは標準出力なしで続行されます。IF EXISTSがtrueを返す場合(このプライマリ・キーを含む行が存在する場合)、以下のようなテーブルが標準出力で表示されます。

UPDATE ... IF EXISTSがTRUEを返す場合の標準出力

一方、そのような行が存在しない場合は、条件によってFALSEが返され、コマンドは失敗します。この場合、標準出力は次のようになります。

UPDATE ... IS EXISTSがFALSEを返す場合の標準出力

選択した行の1つ以上のカラム値にテストを適用するには、IF条件を使用します。
UPDATE cyclist_id SET id = 15a116fc-b833-4da6-ab9a-4a3775750239 where lastname = 'WELTEN' and firstname = 'Bram' IF age = 18;
すべての条件がTRUEを返す場合の標準出力は、IF EXISTSがtrueを返した場合(上記を参照)と同じになります。いずれかの条件が失敗した場合の標準出力には、[applied]カラムにFalseと表示され、失敗した条件に関する情報も表示されます。

UPDATE ... IFがFALSEを返す場合の標準出力

条件付き更新は、軽量トランザクションの一例です。条件付き更新は、多大なパフォーマンス・コストが発生するので、慎重に使用する必要があります。

バッチでの条件付き更新の実行

UPDATEコマンドを使用すると、一致する行が見つからない場合に新しい行が作成されます。新しい行は、同じBATCHに適用された軽量トランザクションですぐには使用できません。

たとえば4つのカラムが定義された簡単なテーブルを考えてみましょう。

CREATE TABLE mytable (a int, b int, s int static, d text, PRIMARY KEY (a, b))

BEGIN BATCH
     INSERT INTO mytable (a, b, d) values (7, 7, 'a')
     UPDATE mytable SET s = 7 WHERE a = 7 IF s = NULL;
APPLY BATCH

上記の最初のバッチでは、insertコマンドによってプライマリ・キーの値が(7,7)のパーティションが作成されますが、sカラムの値は設定されません。この行のsカラムが定義されていなくても、IF s = NULL条件は成功するため、バッチも成功します。(旧バージョンでは条件が失敗し、その障害によりバッチ全体が失敗していました。)

2番目のバッチは、軽量トランザクションのさらに複雑な処理を示しています。

BEGIN BATCH
     INSERT INTO mytable (a, b, d) values (7, 7, 'a')
     UPDATE mytable SET s = 1 WHERE a = 1 IF s = NULL;
APPLY BATCH

この場合、UPDATEによってパーティションが作成される前に、まだ存在していないパーティション内のカラムの値がIF文でテストされます。 そのような場合でも、DataStax Enterpriseはパーティションとそのカラムsの暗黙的な存在を認識し、条件付きテストは成功します。このためバッチも成功します。