UPDATE文

update文を使用すると、表の行を更新できます。また、同じシャード・キーを共有する表内の複数の行の更新もサポートされます。Oracle NoSQLのオンプレミス・バージョンを実行している場合は、表内のシャード・キーを構成する列をここで確認できます。

構文

update_statement ::= 
   UPDATE table_name [[AS] table_alias] 
   update_clause ("," update_clause)* 
   WHERE expression 
   [returning_clause]

returning_clause ::= RETURNING select_list

セマンティクス

更新はサーバーで行われ、読取り-変更-書込みのサイクルが排除されます。つまり、クライアントで行全体をフェッチし、ターゲット・フィールドの新しい値を(現在の値に基づいて)計算してから、行全体をサーバーに返送する必要がありません。

構文的および意味的には、Oracle NoSQL DatabaseのUPDATE文は標準SQLのUPDATE文と似ていますが、Oracle NoSQL Databaseの豊富なデータ・モデルを処理する拡張機能を備えています。前述の構文について次に説明します。
  • 最初に、更新対象の表を名前およびオプションの表の別名で指定します(別名は、トップレベルの列のみにアクセスする場合にのみ省略できます。それ以外の場合は、読取り専用問合せの場合と同様に、ネストしたフィールドにアクセスするパス式の最初のステップとして、別名が必要です)。
  • 次に、1つ以上のUPDATE句を指定します。
  • WHERE句では、どの行を更新するかを指定します。現在の実装では、単一行と複数行の両方の更新がサポートされています。
    • 単一の行を更新するには、WHERE句で完全な主キーを指定する必要があります。
    • 複数の行を更新するには、WHERE句でシャード・キーを指定し、すべての行が必ず同じシャードに存在するようにします。これにより、Oracle NoSQL DatabaseはACIDトランザクションでこの更新を実行できます。例については、「例: 複数の行の更新」を参照してください。
    1つの更新トランザクションでは、成功した場合はすべての変更が適用され、エラーが発生した場合はまったく変更されません。
  • オプションのRETURNING句があります。RETURNING句は、WHERE句に完全な主キーが含まれている場合にのみ機能します。現在は、単一行の更新のみがサポートされています。
    • この句が存在しない場合、更新文の結果は更新された行数になります。次に例を示します
      • WHERE句の条件を満たす行がなかった場合、または更新句で指定された更新のWHERE句で選択された行に対して何も操作が行われなかった場合、ゼロが返されます。
      • WHERE句などの条件を満たす単一行がある場合は、1行が戻されます。
    • それ例外の場合、RETURNING句(ある場合)はSELECT句と同じように機能します。つまり、"*"を指定でき、その場合は更新された完全な行が返されます。または、返される必要があるものを指定する式のリストを指定できます。
  • また、1つの更新問合せで更新できるレコードの数にも制限があります。デフォルトでは、この制限は1,000に設定されます。1つのトランザクションの1つのupdate文で1,000を超えるレコードを変更しようとすると、処理中に失敗します。これを回避するには、setLimit(int limit)メソッドを使用して、デフォルトの制限値をオーバーライドします。詳細は、QueryRequest.setLimit(int limit)を参照してください。必要な制限を設定することで、大規模な更新要件を処理できます。

    ノート:

    デフォルトの制限は上書きできますが、多数の行に対してこれを行うことはお薦めしません。トランザクション中に同じデータに影響する更新操作やその他の読取りおよび書込み操作がタイムアウトしたり、レイテンシが長くなる可能性があるためです。