すべてのプロダクト
Search
ドキュメントセンター

Tablestore:条件付き更新

最終更新日:Sep 21, 2026

列条件を満たす場合にのみ、データテーブル内のデータを更新できます。データが列条件を満たさない場合、更新は失敗します。

前提条件

説明

Condition コンテナーは、行の存在条件 (rowExistenceExpectation)、列条件 (columnCondition)、またはその両方を保持します。設定された条件を setCondition() の RowPutChange、RowUpdateChange、または RowDeleteChange に渡します。これらの行の変更は、BatchWriteRow リクエストに含めることもできます。条件が満たされない場合、サーバーはエラーを返し、行は変更されません。

rowChange.setCondition(condition)
new SingleColumnValueCondition(columnName, operator, columnValue)
new CompositeColumnValueCondition(logicOperator)

次の例では、condition_demo テーブルのプライマリキーが row1 である行を行が存在する場合にのみ更新します。 それ以外の場合、サーバーはエラーを返します。

PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
        .build();

RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));

Condition condition = new Condition();
condition.setRowExistenceExpectation(RowExistenceExpectation.EXPECT_EXIST);
rowUpdateChange.setCondition(condition);

client.updateRow(new UpdateRowRequest(rowUpdateChange));

パラメーター

条件付き更新は、PutRow、UpdateRow、DeleteRow、BatchWriteRow オペレーションの条件として使用できます。

    'condition' => [
        'row_existence' => <RowExistenceExpectation>
        'column_condition' => <ColumnCondition>
    ]   

行の存在条件のみを指定する場合は、次の省略構造を使用できます。

    'condition' => <RowExistenceExpectation>    

SingleColumnValueCondition と CompositeColumnValueCondition の構造は次のとおりです。

SingleColumnValueCondition の構造

    [
        'column_name' => '<string>',
        'value' => <ColumnValue>,
        'comparator' => <ComparatorType>,
        'pass_if_missing' => true || false,
        'latest_version_only' => true || false
    ]

CompositeColumnValueCondition の構造

    [
        'logical_operator' => <LogicalOperator>
        'sub_conditions' => [
            <ColumnCondition>,
            <ColumnCondition>,
            <ColumnCondition>,
            // other conditions
        ]
    ]

パラメーター

説明

row_existence

データテーブルを変更する際、システムは最初に行の存在条件を確認します。条件が満たされない場合、変更は失敗し、エラーが報告されます。

行の存在条件には IGNORE、EXPECT_EXIST、EXPECT_NOT_EXIST があります。これらは RowExistenceExpectationConst::CONST_IGNORE、RowExistenceExpectationConst::CONST_EXPECT_EXIST、RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST で表されます。

  • IGNORE:チェックを無視します。存在チェックは実行されません。

  • EXPECT_EXIST:行が存在することを期待します。行が存在する場合に条件が満たされます。行が存在しない場合は条件が満たされません。

  • EXPECT_NOT_EXIST:行が存在しないことを期待します。行が存在しない場合に条件が満たされます。行が存在する場合は条件が満たされません。

column_name

列名。

value

列と比較する値。

形式は [Value, Type] です。Type には INTEGER、STRING (UTF-8 encoded)、BINARY、BOOLEAN、DOUBLE を指定できます。これらは ColumnTypeConst::CONST_INTEGER、ColumnTypeConst::CONST_STRING、ColumnTypeConst::CONST_BINARY、ColumnTypeConst::CONST_BOOLEAN、ColumnTypeConst::CONST_DOUBLE で表されます。BINARY の場合は type の指定が必須です。その他の値の場合、type の指定は任意です。

type が BINARY ではない場合は、省略して Value のみ指定できます。

comparator

列の値を比較するために使用する関係演算子。型の詳細については、「ComparatorType」をご参照ください。

関係演算子には EQUAL (=)、NOT_EQUAL (!=)、GREATER_THAN (>)、GREATER_EQUAL (>=)、LESS_THAN (<)、LESS_EQUAL (<=) があります。これらは ComparatorTypeConst::CONST_EQUAL、ComparatorTypeConst::CONST_NOT_EQUAL、ComparatorTypeConst::CONST_GREATER_THAN、ComparatorTypeConst::CONST_GREATER_EQUAL、ComparatorTypeConst::CONST_LESS_THAN、ComparatorTypeConst::CONST_LESS_EQUAL で表されます。

logical_operator

複数の条件を結合するために使用する論理演算子。型の詳細については、「LogicalOperator」をご参照ください。

論理演算子には NOT、AND、OR があります。これらは LogicalOperatorConst::CONST_NOT、LogicalOperatorConst::CONST_AND、LogicalOperatorConst::CONST_OR で表されます。

追加できるサブ条件の数は、論理演算子に依存します。

  • 論理演算子が NOT の場合は、サブ条件を 1 つだけ追加できます。

  • 論理演算子が AND または OR の場合は、少なくとも 2 つのサブ条件を追加する必要があります。

pass_if_missing

行に列が存在しない場合に、条件チェックを通過させるかどうかを指定します。型はブール型です。デフォルト値は true です。つまり、行に列が存在しない場合でも、条件チェックは成功し、その行は更新条件を満たします。

pass_if_missing を false に設定すると、行に列が存在しない場合に条件チェックが失敗します。その行は更新条件を満たしません。

latest_version_only

列に複数のバージョンがある場合に、比較対象として列値の最新バージョンのみを使用するかどうかを指定します。型はブール型です。デフォルト値は true です。つまり、列に複数のバージョンがある場合、比較には最新バージョンのみが使用されます。

latest_version_only を false に設定し、列に複数のバージョンがある場合は、列値のすべてのバージョンが比較に使用されます。この場合、いずれかのバージョンが条件を満たすと、条件チェックは成功し、その行が更新条件を満たします。

例

行の存在条件に基づくデータ操作の実行

次の例では、プライマリキーと指定した行の存在条件に基づいて、行に対するオペレーションを実行する方法を示します。

$request = array (
    'tables' => array (
        array (
            'table_name' => 'my_table',
            'rows' => array (  
                array (
                    // PUT オペレーション
                    'operation_type' => OperationTypeConst::CONST_PUT,
                    // 行が存在しないことを期待します。行が存在しない場合に条件が満たされます。
                    'condition' => RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST,
                    'primary_key' => array (
                        array('PK1', 'PrimaryKey'),
                        array('PK2', 11),
                    ),
                    'attribute_columns' => array (
                        array('attr1', 'Tablestore'),
                        array('attr2', 128)
                    )
                ),

                array (
                    // UPDATE オペレーション
                    'operation_type' => OperationTypeConst::CONST_UPDATE,
                    // 行が存在することを期待します。行が存在する場合に条件が満たされます。
                    'condition' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
                    'primary_key' => array (
                        array('PK1', 'PrimaryKey'),
                        array('PK2', 22),
                    ),
                    'update_of_attribute_columns'=> array(
                        'PUT' => array (
                            array('attr1', 'OTS'),
                            array('attr2',  256)
                        )
                    )
                ),
                
                array (
                    // DELETE オペレーション
                    'operation_type' => OperationTypeConst::CONST_DELETE, 
                    // 無視します。存在チェックは実行されません。
                    'condition' => RowExistenceExpectationConst::CONST_IGNORE,
                    'primary_key' => array (
                        array('PK1', 'PrimaryKey'),
                        array('PK2', 33),
                    )
                ),
            )
        )
    )
);

$response = $otsClient->batchWriteRow ($request);

// テーブルごとのレスポンスを処理します
foreach ($response['tables'] as $tableData) {
    print "Handling table {$tableData['table_name']} ...\n";
    
    // このテーブルの PutRow の結果を処理します
    $putRows = $tableData['rows'];
    
    foreach ($putRows as $rowData) {
      
      if ($rowData['is_ok']) {
        // 書き込みオペレーションは成功しました
        print "Capacity Unit Consumed: {$rowData['consumed']['capacity_unit']['write']}\n";
      } else {
        // エラーが発生しました
        print "Error: {$rowData['error']['code']} {$rowData['error']['message']}\n";
      }
    }
  }

行条件と列条件に基づくデータ操作の実行

次の例では、行条件と列条件に基づいてオペレーションを実行する方法を示します。

$request = array (
    'tables' => array (
        array (
            'table_name' => 'MyTable',
            'rows' => array (  
                // SingleColumnValueCondition の構造
                  array (
                    // UPDATE オペレーション
                    'operation_type' => OperationTypeConst::CONST_UPDATE,
                    'condition' => array (
                        'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
                        // attr2 != 256
                        'column_condition' => array (
                            'column_name' => 'attr2',
                            'value' => 256,
                            'comparator' => ComparatorTypeConst::CONST_NOT_EQUAL
                        )
                    ),
                    'primary_key' => array (
                        array('PK1', 'PrimaryKey'),
                        array('PK2', 11)
                    ),
                    // 更新または追加する列を attribute_columns/put で指定します。
                    'update_of_attribute_columns'=> array(
                        'PUT' => array (
                            array('attr1', 'OTS'),
                            array('attr2',  128)
                        )
                    )
                ),

                // CompositeColumnValueCondition の構造
                array ( 
                    // UPDATE オペレーション
                    'operation_type' => OperationTypeConst::CONST_UPDATE,
                    'condition' => array (
                        'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
                        // attr1 = 'Tablestore' and attr2 >= 256
                        'column_condition' => array (
                            'logical_operator' => LogicalOperatorConst::CONST_AND,
                            'sub_conditions' => array (
                                array (
                                    'column_name' => 'attr2',
                                    'value' => 256,
                                    'comparator' => ComparatorTypeConst::CONST_GREATER_EQUAL
                                ),
                                array (
                                    'column_name' => 'attr1',
                                    'value' => 'Tablestore',
                                    'comparator' => ComparatorTypeConst::CONST_EQUAL
                                )
                            )
                        )
                    ),
                    'primary_key' => array (
                        array('PK1', 'pkValue'),
                        array('PK2', 22)
                    ),
                    'update_of_attribute_columns'=> array(
                        'PUT' => array (),
                        // 削除する列を 'DELETE_ALL' で指定します。
                        'DELETE_ALL' => array(
                            'attr1',
                            'attr2'
                        )
                    )
                ),
            )
        )
    )
);

$response = $otsClient->batchWriteRow ($request);

// テーブルごとのレスポンスを処理します
foreach ($response['tables'] as $tableData) {
    print "Handling table {$tableData['table_name']} ...\n";
    
    // このテーブルの PutRow の結果を処理します
    $putRows = $tableData['rows'];
    
    foreach ($putRows as $rowData) {
      
      if ($rowData['is_ok']) {
        // 書き込みオペレーションは成功しました
        print "Capacity Unit Consumed: {$rowData['consumed']['capacity_unit']['write']}\n";
      } else {
        // エラーが発生しました
        print "Error: {$rowData['error']['code']} {$rowData['error']['message']}\n";
      }
    }
  }

条件を使用した楽観的ロックの実装と列の値のインクリメント

次の例では、楽観的ロックを実装し、列の値をインクリメントするための条件を作成する方法を示します。

    // データの行を読み取ります。
    $request = [
        'table_name' => 'MyTable', 
        'primary_key' => [ // プライマリキー。
            ['PK0', 123],
            ['PK1', 'abc']
        ],
        'max_versions' => 1
    ];
    $response = $otsClient->getRow ($request);
    $columnMap = getColumnValueAsMap($response['attribute_columns']);
    $col0Value = $columnMap['col0'][0][1];
    // 条件付きで col0 列を更新し、値を 1 インクリメントします。
    $request = [
        'table_name' => 'MyTable',
        'condition' => [
            'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
            'column_condition' => [                  // 条件が満たされた場合、データを更新します。
                'column_name' => 'col0',
                'value' => $col0Value,
                'comparator' => ComparatorTypeConst::CONST_EQUAL
            ]
        ],
        'primary_key' => [ // プライマリキー。
            ['PK0', 123],
            ['PK1', 'abc']
        ],
        'update_of_attribute_columns'=> [
            'PUT' => [
                ['col0', $col0Value+1]
            ]
        ]
    ];
    $response = $otsClient->updateRow ($request);

その他のコード例については、PutRow@GitHub、UpdateRow@GitHub、DeleteRow@GitHub、BatchWriteRow@GitHub をご参照ください。