OceanBase
English日本語简体中文
ドキュメントホーム
製品
エコシステム
リリース

データベース

OceanBase CloudOceanBaseデータベース

データベース

OceanBase CloudOceanBaseデータベース
OceanBase CloudOceanBaseデータベース

OceanBaseデータベース

KV - V4.4.2
  • OBKVの概要
  • OBKVのアーキテクチャ
  • OBKV-Table
    • OBKV-Table概要
      • OBKV-Tableの概要
      • OBKV-Tableのコア機能
      • OBKV-Tableデプロイの概要
    • シンプルなKey-Valueストレージのクイックスタート(Java)
    • OBKV-Table Javaクライアントを使ったアプリケーション開発
      • OBKV-Table Java開発ガイド
      • OBKV-Table開発の準備
      • OBKV-Table Javaクライアントを使用してクラスタに接続する
      • OBKV-Table操作例
        • OBKV-Tableへのデータ書き込み
        • OBKV-Tableによるデータのクエリ
        • OBKV-Tableでのデータ更新
        • OBKV-Tableによるデータの削除
      • OBKV-Table Javaクライアントのパラメータ設定
    • OBKV-Table管理
      • OBKV-Table管理の概要
      • OBKV-Tableの高可用性
      • OBKV-Tableのセキュリティ権限
      • OBKV-Tableモニタリングメトリクス
    • OBKV-Tableリファレンス
      • OBKV-Tableのデータモデル
      • OBKV-Tableの操作タイプ
      • OBKV-Tableがサポートするデータ型
      • OBKV-Table全文インデックス
      • OBKV-Tableのグローバルインデックスの使用範囲と例
      • OBKV-Tableの期限切れデータ削除
      • OBKV-Tableのグループコミット
      • OBKV-Tableの弱い整合性読み取りと最寄りデータセンターからの読み取り
      • OBKV-Table関連ビュー
    • OBKV-Table よくある質問
  • OBKV-HBase
    • OBKV-HBaseの概要
    • OBKV-HBaseのコア機能
    • OBKV-HBaseのデプロイ
    • OBKV-HBaseによるアプリケーション開発
      • OBKV-HBase アプリケーション開発の概要
      • OBKV-HBase Javaクライアントを使用したクラスタへの接続
      • HBaseの業務コードをOBKV-HBaseに移行する
      • OBKV-HBase データ操作の例
    • OBKV-HBase 移行ガイド
    • OBKV-HBase管理
      • OBKV-HBase管理の概要
      • OBKV-HBaseの高可用性
      • OBKV-HBaseのセキュリティ権限
      • OBKV-HBaseモニタリングメトリクス
    • OBKV-HBaseクエリの最適化
    • OBKV-HBaseの性能テスト
    • OBKV-HBaseリファレンス
      • OBKV-HBaseデータモデル
      • OBKV-HBaseのデータスキーマ
      • HBaseとの互換インターフェース
      • HBaseと互換性のあるフィルター
      • OBKV-HBaseの自動パーティション分割
      • OBKV-HBaseにおける期限切れデータの削除
      • OBKV-HBaseの弱い整合性読み取りと最寄りデータセンターからの読み取り
      • OBKV-HBase関連ビュー
    • OBKV-HBaseエコシステム統合
      • Flink連携
        • Flinkコネクタを使用してOBKV-HBaseにデータを同期する
        • ネイティブFlinkによるOBKV-HBaseへのアクセス
      • HiveによるOBKV-HBaseへのアクセス
      • SparkによるOBKV-HBaseへのアクセス
  • OBKVリリースノート
    • OBKV Enterprise版

PDF をダウンロード

ドキュメントフィードバック
  1. ドキュメントセンター
  2. OceanBaseデータベース
  3. KV
  4. V4.4.2

OBKV-Tableでのデータ更新

最終更新:2026-09-30 06:35:08

更新をサポートするインターフェース
更新例
前提条件
単一行の更新
一括更新

OBKV-Table Javaクライアントは、単一行データの更新と一括データの更新をサポートしています。業務ニーズに応じて、適切なインターフェースを選択してデータを更新することができます。

更新をサポートするインターフェース

ObTableClientが更新をサポートするインターフェースは以下のとおりです。

インターフェース
説明
注意事項
update(String tableName) 1行のデータを更新します。更新条件を設定できます。
insertOrUpdate(String tableName) 1行のデータを挿入または更新します。
replace(String tableName) 1行のデータを置き換えます(既存行を削除してから、新しい行を書き込むロジック)。
put(String tableName) 1行のデータを上書きします。
  • すべての列を更新する必要があります。
  • テーブルにインデックスがないことが条件です。
  • テーブルにLOB型の列がないことが条件です。
  • テナントのbinlog_row_image値はminimalである必要があります。
increment(String tableName) 整数型の列の値をアトミックに加算します。 古い行が存在しない場合、指定されたdelta値を持つ新しい行を作成します。
append(String tableName) 文字列型の列に文字列をアトミックに追加します。 古い行が存在しない場合、新しい行を追加し、指定されたdelta値を設定します。
checkAndInsUp(String tableName, ObTableFilter filter, InsertOrUpdate insUp, boolean checkExists, boolean rollbackWhenCheckFailed) 条件に応じて挿入または更新します。
  • 行の存在確認とfilter条件の判定は別の処理です。行の存在は主キーに基づいて判断し、filter条件を満たすかどうかとは区別します。
  • 行が存在する場合:filter条件を満たせば更新し、満たさなければ何もしません。
  • 行が存在しない場合:checkExists = trueなら何もせず、checkExists = falseなら挿入します。
  • チェックに失敗した場合:rollbackWhenCheckFailed = falseならエラーを返しません。rollbackWhenCheckFailed = trueならObTableExceptionをスローし、エラーメッセージは[-10518][OB_KV_CHECK_FAILED][Check failed in CheckAndInsUp]となります。

更新例

前提条件

  1. ObTableClientの初期化が完了していること。
  2. データベースにリレーショナルテーブルが作成されていること。説明を容易にするため、以下のリレーショナルテーブルを用いて説明します。
    CREATE TABLE IF NOT EXISTS `employees` (
    `employeeId` int NOT NULL,
    `name` varchar(100) NOT NULL,
    `department` varchar(50),
    `position` varchar(50),
    `workYear` int,
    `comment` varchar(100),
    PRIMARY KEY (`employeeId`)
    ) PARTITION BY KEY(`employeeId`) PARTITIONS 97;
    

単一行の更新

update

この例では、主キーemployeeIdが1001の行のworkYearを11に更新します。

// データベースには既に以下のデータが存在していると仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void updateRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey = row().add(colVal("employeeId", 1001));
    Row properties = row().add(colVal("workYear", 11));
    obkvHandle.update("employees")
            .setRowKey(rowKey)
            .addMutateRow(properties)
            .execute();
}

この例では、主キーemployeeIdが1001の行で、workYearが3以上の場合にworkYearを11に更新します。

// データベースには既に以下のデータが存在していると仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void updateRowWithFilter(ObTableClient obkvHandle) throws Exception {
    Row rowKey = row().add(colVal("employeeId", 1001));
    Row properties = row().add(colVal("workYear", 11));
    ObTableValueFilter filter = compareVal(ObCompareOp.GE, "workYear", 3);
    obkvHandle.update("employees")
            .setRowKey(rowKey)
            .addMutateRow(properties)
            .setFilter(filter)
            .execute();
}

insertOrUpdate

この例では、主キーemployeeIdが1001の行のworkYearを11に更新します。

// データベースには既に以下のデータが存在していることを仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void insertOrUpdateRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey = row().add(colVal("employeeId", 1001));
    Row properties = row().add(colVal("workYear", 11));
    obkvHandle.insertOrUpdate("employees")
            .setRowKey(rowKey)
            .addMutateRow(properties)
            .execute();
}

replace

この例では、主キーemployeeIdが1001の行のworkYearを11に更新します。

// データベースには既に以下のデータが存在していることを仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void replaceRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey = row().add(colVal("employeeId", 1001));
    Row properties = row().add(colVal("name", "zhangsan"))
            .add(colVal("department", "R&D"))
            .add(colVal("position", "dev"))
            .add(colVal("workYear", 11));
    obkvHandle.replace("employees")
            .setRowKey(rowKey)
            .addMutateRow(properties)
            .execute();
}

put

この例では、主キーemployeeIdが1001の行を上書きし、workYearを11に設定します。

// データベースには既に以下のデータが存在するものとします
/*
+------------+----------+------------+----------+-----------+--------------+
| employeeId | name     | department | position | workYear  | comment      |
+------------+----------+------------+----------+-----------+--------------+
|       1001 | zhangsan | R&D        | dev      |        10 | new employee |
+------------+----------+------------+----------+-----------+--------------+
*/
private static void putRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey = row().add(colVal("employeeId", 1001));
    Row properties = row().add(colVal("name", "zhangsan"))
            .add(colVal("department", "R&D"))
            .add(colVal("position", "dev"))
            .add(colVal("workYear", 1))
            .add(colVal("comment", "new employee"));
    obkvHandle.put("employees")
            .setRowKey(rowKey)
            .addMutateRow(properties)
            .execute();
}

increment

この例では、主キーemployeeIdが1001の行のworkYearに1をアトミックに加算し、結果を11にします。

// データベースには既に以下のデータが存在するものとします
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void incrementRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey = row().add(colVal("employeeId", 1001));
    Row properties = row().add(colVal("workYear", 1));
    obkvHandle.increment("employees")
            .setRowKey(rowKey)
            .addMutateRow(properties)
            .execute();
}

append

サンプルコードでは、一行のデータを更新し、主キー employeeId が 1001 の position に文字列 dev を追加します。最終的な結果は java dev となります。

// データベースには既に以下のデータが存在するものと仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | java     |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void appendRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey = row().add(colVal("employeeId", 1001));
    Row properties = row().add(colVal("position", "dev"));
    obkvHandle.append("employees")
            .setRowKey(rowKey)
            .addMutateRow(properties)
            .execute();
}

checkAndInsUp

サンプルコードは、主キー employeeId が 1001 の workYear が 3 以上であるかどうかをチェックします。3 以上の場合、insertUpOp を実行して comment を good に更新します。

// データベースには既に以下のデータが存在すると仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void checkAndInsUpRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey = row().add(colVal("employeeId", 1001));
    Row properties = row().add(colVal("name", "zhangsan"))
            .add(colVal("department", "R&D"))
            .add(colVal("position", "dev"))
            .add(colVal("workYear", 10))
            .add(colVal("comment", "good"));
    InsertOrUpdate insertUpOp = insertOrUpdate().setRowKey(rowKey).addMutateRow(properties);
    ObTableValueFilter filter = compareVal(ObCompareOp.GE, "workYear", 3);
    MutationResult result = obkvHandle.checkAndInsUp("employees", filter, insertUpOp, true)
            .execute();
    System.out.println(result.getAffectedRows());
}

一括更新

batchUpdate

サンプルコードでは、1回のバッチ処理で2行のデータを更新し、主キー employeeId が 1001 および 1002 の workYear をどちらも 11 に更新します。

// データベースには既に以下のデータが存在するものと仮定します
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
|       1002 | lisi     | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchUpdateRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey1 = row().add(colVal("employeeId", 1001));
    Row rowKey2 = row().add(colVal("employeeId", 1002));
    Row properties1 = row().add(colVal("workYear", 11));
    Row properties2 = row().add(colVal("workYear", 11));
    Update updateOp1 = update().setRowKey(rowKey1).addMutateRow(properties1);
    Update updateOp2 = update().setRowKey(rowKey2).addMutateRow(properties2);
    BatchOperationResult res = obkvHandle.batchOperation("employees")
            .addOperation(updateOp1,updateOp2)
            .execute();
    System.out.println(res.hasError());
}

batchInsertOrUpdate

サンプルコードでは、1回のバッチ処理で2行のデータを更新し、主キー employeeId が 1001 および 1002 の workYear をいずれも 11 に変更します。

// データベースには既に以下のデータが存在すると仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
|       1002 | lisi     | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchInsertOrUpdateRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey1 = row().add(colVal("employeeId", 1001));
    Row rowKey2 = row().add(colVal("employeeId", 1002));
    Row properties1 = row().add(colVal("workYear", 11));
    Row properties2 = row().add(colVal("workYear", 11));
    InsertOrUpdate insertUpOp1 = insertOrUpdate().setRowKey(rowKey1).addMutateRow(properties1);
    InsertOrUpdate insertUpOp2 = insertOrUpdate().setRowKey(rowKey2).addMutateRow(properties2);
    BatchOperationResult res = obkvHandle.batchOperation("employees")
            .addOperation(insertUpOp1,insertUpOp2)
            .execute();
    System.out.println(res.hasError());
}

batchReplace

サンプルコードでは、1回のバッチ処理で2行のデータを更新します。主キーemployeeIdが1001および1002のworkYearをどちらも11に更新します。

// データベースには既に以下のデータが存在していることを仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
|       1002 | lisi     | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchReplaceRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey1 = row().add(colVal("employeeId", 1001));
    Row rowKey2 = row().add(colVal("employeeId", 1002));
    Row properties1 = row().add(colVal("name", "zhangsan"))
            .add(colVal("department", "R&D"))
            .add(colVal("position", "dev"))
            .add(colVal("workYear", 11));
    Row properties2 = row().add(colVal("name", "lisi"))
            .add(colVal("department", "R&D"))
            .add(colVal("position", "dev"))
            .add(colVal("workYear", 11));
    Replace replaceOp1 = replace().setRowKey(rowKey1).addMutateRow(properties1);
    Replace replaceOp2 = replace().setRowKey(rowKey2).addMutateRow(properties2);
    BatchOperationResult res = obkvHandle.batchOperation("employees")
            .addOperation(replaceOp1,replaceOp2)
            .execute();
    System.out.println(res.hasError());
}

batchPut

サンプルコードでは、1回のバッチ処理で2行のデータを更新します。主キー employeeId が 1001 と 1002 の workYear をどちらも 11 に更新します。

// データベースには既に以下のデータが存在することを仮定します。
/*
+------------+----------+------------+----------+-----------+--------------+
| employeeId | name     | department | position | workYear  | comment      |
+------------+----------+------------+----------+-----------+--------------+
|       1001 | zhangsan | R&D        | dev      |        10 | new employee |
|       1002 | lisi     | R&D        | dev      |        10 | new employee |
+------------+----------+------------+----------+-----------+--------------+
*/
private static void batchPutRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey1 = row().add(colVal("employeeId", 1001));
    Row rowKey2 = row().add(colVal("employeeId", 1002));
    Row properties1 = row().add(colVal("name", "zhangsan"))
            .add(colVal("department", "R&D"))
            .add(colVal("position", "dev"))
            .add(colVal("workYear", 11))
            .add(colVal("comm   ent", "new employee"));
    Row properties2 = row().add(colVal("name", "lisi"))
            .add(colVal("department", "R&D"))
            .add(colVal("position", "dev"))
            .add(colVal("workYear", 11))
            .add(colVal("comment", "new employee"));
    Put putOp1 = put().setRowKey(rowKey1).addMutateRow(properties1);
    Put putOp2 = put().setRowKey(rowKey2).addMutateRow(properties2);
    BatchOperationResult res = obkvHandle.batchOperation("employees")
            .addOperation(putOp1,putOp2)
            .execute();
    System.out.println(res.hasError());
}

batchIncrement

サンプルコードでは、1バッチ内で2行のデータを更新し、主キー employeeId が 1001 および 1002 の workYear をそれぞれ 1 加算します。最終的な結果は 11 となります。

// データベースには既に以下のデータが存在することを仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
|       1002 | lisi     | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchIncrementRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey1 = row().add(colVal("employeeId", 1001));
    Row rowKey2 = row().add(colVal("employeeId", 1002));
    Row properties1 = row().add(colVal("workYear", 1));
    Row properties2 = row().add(colVal("workYear", 1));
    Increment incrementOp1 = increment().setRowKey(rowKey1).addMutateRow(properties1);
    Increment incrementOp2 = increment().setRowKey(rowKey2).addMutateRow(properties2);
    BatchOperationResult res = obkvHandle.batchOperation("employees")
            .addOperation(incrementOp1,incrementOp2)
            .execute();
    System.out.println(res.hasError());
}

batchAppend

サンプルコードでは、一度のバッチ処理で2行のデータを更新し、主キー employeeId が 1001 および 1002 の position に文字列 dev を追加し、最終的な結果は java dev となります。

// データベースには既に以下のデータが存在することを前提とします。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | java     |       10 | NULL    |
|       1001 | lisi     | R&D        | java     |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchAppendRow(ObTableClient obkvHandle) throws Exception {
    Row rowKey1 = row().add(colVal("employeeId", 1001));
    Row rowKey2 = row().add(colVal("employeeId", 1002));
    Row properties1 = row().add(colVal("position", " dev"));
    Row properties2 = row().add(colVal("position", " dev"));
    Append appendOp1 = append().setRowKey(rowKey1).addMutateRow(properties1);
    Append appendOp2 = append().setRowKey(rowKey2).addMutateRow(properties2);
    BatchOperationResult res = obkvHandle.batchOperation("employees")
            .addOperation(appendOp1,appendOp2)
            .execute();
    System.out.println(res.hasError());
}

batchCheckAndInsUp

サンプルコードは、主キー employeeId が 1001 および 1002 の workYear が 3 以上であるかどうかをチェックし、3 以上の場合は comment を good に更新します。

// データベースには既に以下のデータが存在するものと仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name     | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
|       1001 | zhangsan | R&D        | dev      |       10 | NULL    |
|       1002 | lisi     | R&D        | dev      |       10 | NULL    |
+------------+----------+------------+----------+----------+---------+
*/
Row rowKey1 = row().add(colVal("employeeId", 1001));
    Row rowKey2 = row().add(colVal("employeeId", 1002));
    Row properties1 = row().add(colVal("name", "zhangsan"))
            .add(colVal("department", "R&D"))
            .add(colVal("position", "dev"))
            .add(colVal("workYear", 10))
            .add(colVal("comment", "good"));
    Row properties2 = row().add(colVal("name", "lisi"))
            .add(colVal("department", "R&D"))
            .add(colVal("position", "dev"))
            .add(colVal("workYear", 10))
            .add(colVal("comment", "good"));
    InsertOrUpdate insertUpOp1 = insertOrUpdate().setRowKey(rowKey1).addMutateRow(properties1);
    InsertOrUpdate insertUpOp2 = insertOrUpdate().setRowKey(rowKey2).addMutateRow(properties2);
    ObTableValueFilter filter = compareVal(ObCompareOp.GE, "workYear", 3);
    CheckAndInsUp ckOp1 = new CheckAndInsUp(filter, insertUpOp1, true);
    CheckAndInsUp ckOp2 = new CheckAndInsUp(filter, insertUpOp2, true);
    BatchOperationResult res = obkvHandle.batchOperation("employees")
            .addOperation(ckOp1,ckOp2)
            .execute();
    System.out.println(res.hasError());
}

前のトピック

OBKV-Tableによるデータのクエリ
前へ

次のトピック

OBKV-Tableによるデータの削除
次へ
このページの内容
更新をサポートするインターフェース
更新例
前提条件
単一行の更新
一括更新