Tous les produits
Search
Centre de documentation

Tablestore:Mises à jour conditionnelles

Dernière mise à jour :Aug 19, 2026

Prérequis

Description

Le conteneur Condition contient une condition d'existence de ligne (rowExistenceExpectation), une condition de colonne (columnCondition), ou les deux. Transmettez la condition configurée à la méthode setCondition() sur les objets RowPutChange, RowUpdateChange ou RowDeleteChange. Ces modifications de ligne peuvent également être incluses dans une requête BatchWriteRow. Si la condition n'est pas remplie, le serveur renvoie une erreur et la ligne reste inchangée.

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

L'exemple suivant met à jour la ligne dont la clé primaire est row1 dans la table condition_demo uniquement si la ligne existe. Dans le cas contraire, le serveur renvoie une erreur.

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));

Paramètres

Les mises à jour conditionnelles peuvent servir de condition pour les opérations PutRow, UpdateRow, DeleteRow et BatchWriteRow.

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

Si seule une condition d'existence de ligne est spécifiée, vous pouvez utiliser la structure abrégée suivante.

    'condition' => <RowExistenceExpectation>    

Les structures pour SingleColumnValueCondition et CompositeColumnValueCondition sont présentées ci-dessous.

Structure SingleColumnValueCondition

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

Structure CompositeColumnValueFilter

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

Paramètre

Description

row_existence

Lorsque vous modifiez une table de données, le système vérifie d'abord la condition d'existence de la ligne. Si la condition n'est pas remplie, la modification échoue et une erreur est signalée.

Les conditions d'existence de ligne incluent IGNORE, EXPECT_EXIST et EXPECT_NOT_EXIST. Elles sont représentées par RowExistenceExpectationConst::CONST_IGNORE, RowExistenceExpectationConst::CONST_EXPECT_EXIST et RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST.

  • IGNORE : Ignore la vérification. Aucune vérification d'existence n'est effectuée.

  • EXPECT_EXIST : Attend que la ligne existe. La condition est remplie si la ligne existe. La condition n'est pas remplie si la ligne n'existe pas.

  • EXPECT_NOT_EXIST : Attend que la ligne n'existe pas. La condition est remplie si la ligne n'existe pas. La condition n'est pas remplie si la ligne existe.

column_name

Le nom de la colonne.

value

La valeur à comparer avec la colonne.

Le format est [Valeur, Type]. Le type peut être INTEGER, STRING (encodé en UTF-8), BINARY, BOOLEAN ou DOUBLE. Ces types sont représentés par ColumnTypeConst::CONST_INTEGER, ColumnTypeConst::CONST_STRING, ColumnTypeConst::CONST_BINARY, ColumnTypeConst::CONST_BOOLEAN et ColumnTypeConst::CONST_DOUBLE. Le type est obligatoire pour BINARY. Pour les autres valeurs, le type est facultatif.

Si le type n'est pas BINARY, vous pouvez utiliser le format abrégé Valeur.

comparator

L'opérateur relationnel utilisé pour comparer la valeur de la colonne. Pour plus d'informations sur le type, consultez ComparatorType.

Les opérateurs relationnels incluent EQUAL (=), NOT_EQUAL (!=), GREATER_THAN (>), GREATER_EQUAL (>=), LESS_THAN (<) et LESS_EQUAL (<=). Ils sont représentés par ComparatorTypeConst::CONST_EQUAL, ComparatorTypeConst::CONST_NOT_EQUAL, ComparatorTypeConst::CONST_GREATER_THAN, ComparatorTypeConst::CONST_GREATER_EQUAL, ComparatorTypeConst::CONST_LESS_THAN et ComparatorTypeConst::CONST_LESS_EQUAL.

logical_operator

L'opérateur logique utilisé pour combiner plusieurs conditions. Pour plus d'informations sur le type, consultez LogicalOperator.

Les opérateurs logiques incluent NOT, AND et OR. Ils sont représentés par LogicalOperatorConst::CONST_NOT, LogicalOperatorConst::CONST_AND et LogicalOperatorConst::CONST_OR.

Le nombre de sous-conditions que vous pouvez ajouter dépend de l'opérateur logique.

  • Si l'opérateur logique est NOT, vous ne pouvez ajouter qu'une seule sous-condition.

  • Si l'opérateur logique est AND ou OR, vous devez ajouter au moins deux sous-conditions.

pass_if_missing

Indique si la vérification de la condition réussit lorsque la colonne n'existe pas dans une ligne. Le type est booléen. La valeur par défaut est true. Cela signifie que si la colonne n'existe pas dans une ligne, la vérification de la condition réussit et la ligne satisfait la condition de mise à jour.

Si vous définissez pass_if_missing sur false, la vérification de la condition échoue lorsque la colonne n'existe pas dans une ligne. La ligne ne satisfait pas la condition de mise à jour.

latest_version_only

Indique s'il faut utiliser uniquement la dernière version de la valeur de la colonne pour la comparaison si la colonne possède plusieurs versions. Le type est booléen. La valeur par défaut est true. Cela signifie que si la colonne possède plusieurs versions, seule la dernière version est utilisée pour la comparaison.

Si vous définissez latest_version_only sur false et que la colonne possède plusieurs versions, toutes les versions de la valeur de la colonne sont utilisées pour la comparaison. Dans ce cas, si une version quelconque satisfait la condition, la vérification de la condition réussit et la ligne satisfait la condition de mise à jour.

Exemples

Effectuer des opérations de données basées sur des conditions d'existence de ligne

L'exemple suivant montre comment effectuer une opération sur une ligne en fonction de sa clé primaire et d'une condition d'existence de ligne spécifiée.

$request = array (
    'tables' => array (
        array (
            'table_name' => 'my_table',
            'rows' => array (  
                array (
                    // PUT operation
                    'operation_type' => OperationTypeConst::CONST_PUT,
                    // Expects the row to not exist. The condition is met if the row does not exist.
                    '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
                    'operation_type' => OperationTypeConst::CONST_UPDATE,
                    // Expects the row to exist. The condition is met if the row exists.
                    '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
                    'operation_type' => OperationTypeConst::CONST_DELETE, 
                    // Ignore. No existence check is performed.
                    'condition' => RowExistenceExpectationConst::CONST_IGNORE,
                    'primary_key' => array (
                        array('PK1', 'PrimaryKey'),
                        array('PK2', 33),
                    )
                ),
            )
        )
    )
);

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

// Process the response for each table
foreach ($response['tables'] as $tableData) {
    print "Handling table {$tableData['table_name']} ...\n";
    
    // Process the PutRow results for this table
    $putRows = $tableData['rows'];
    
    foreach ($putRows as $rowData) {
      
      if ($rowData['is_ok']) {
        // The write operation is successful
        print "Capacity Unit Consumed: {$rowData['consumed']['capacity_unit']['write']}\n";
      } else {
        // An error occurred
        print "Error: {$rowData['error']['code']} {$rowData['error']['message']}\n";
      }
    }
  }

Effectuer des opérations de données basées sur des conditions de ligne et de colonne

L'exemple suivant montre comment effectuer une opération basée sur des conditions de ligne et de colonne.

$request = array (
    'tables' => array (
        array (
            'table_name' => 'MyTable',
            'rows' => array (  
                // SingleColumnValueCondition structure
                  array (
                    // UPDATE operation
                    '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)
                    ),
                    // Use attribute_columns/put to specify the columns to update or append.
                    'update_of_attribute_columns'=> array(
                        'PUT' => array (
                            array('attr1', 'OTS'),
                            array('attr2',  128)
                        )
                    )
                ),

                // CompositeColumnValueFilter structure
                array ( 
                    // UPDATE operation
                    '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 (),
                        // Use attribute_columns/delete to specify the columns to delete.
                        'DELETE_ALL' => array(
                            'attr1',
                            'attr2'
                        )
                    )
                ),
            )
        )
    )
);

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

// Process the response for each table
foreach ($response['tables'] as $tableData) {
    print "Handling table {$tableData['table_name']} ...\n";
    
    // Process the PutRow results for this table
    $putRows = $tableData['rows'];
    
    foreach ($putRows as $rowData) {
      
      if ($rowData['is_ok']) {
        // The write operation is successful
        print "Capacity Unit Consumed: {$rowData['consumed']['capacity_unit']['write']}\n";
      } else {
        // An error occurred
        print "Error: {$rowData['error']['code']} {$rowData['error']['message']}\n";
      }
    }
  }

Utiliser une condition pour implémenter le verrouillage optimiste et incrémenter une colonne

L'exemple suivant montre comment créer une condition pour implémenter le verrouillage optimiste et incrémenter une colonne.

    // Read a row of data.
    $request = [
        'table_name' => 'MyTable', 
        'primary_key' => [ // Primary key.
            ['PK0', 123],
            ['PK1', 'abc']
        ],
        'max_versions' => 1
    ];
    $response = $otsClient->getRow ($request);
    $columnMap = getColumnValueAsMap($response['attribute_columns']);
    $col0Value = $columnMap['col0'][0][1];
    // Conditionally update the col0 column to increment its value by 1.
    $request = [
        'table_name' => 'MyTable',
        'condition' => [
            'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
            'column_condition' => [                  // If the condition is met, update the data.
                'column_name' => 'col0',
                'value' => $col0Value,
                'comparator' => ComparatorTypeConst::CONST_EQUAL
            ]
        ],
        'primary_key' => [ // Primary key.
            ['PK0', 123],
            ['PK1', 'abc']
        ],
        'update_of_attribute_columns'=> [
            'PUT' => [
                ['col0', $col0Value+1]
            ]
        ]
    ];
    $response = $otsClient->updateRow ($request);

Pour plus d'exemples de code, consultez PutRow@GitHub, UpdateRow@GitHub, DeleteRow@GitHub et BatchWriteRow@GitHub.