Tous les produits
Search
Centre de documentation

Tablestore:Mises à jour conditionnelles

Dernière mise à jour :Sep 20, 2026

Vous ne pouvez mettre à jour les données d'une table que si elles satisfont la condition de colonne spécifiée. Si les données ne remplissent pas cette condition, la mise à jour échoue.

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() des objets RowPutChange, RowUpdateChange ou RowDeleteChange. Ces modifications de ligne peuvent également être incluses dans une requête BatchWriteRow. Si la condition n'est pas satisfaite, 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 s'appliquent aux 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, utilisez la structure abrégée suivante.

    'condition' => <RowExistenceExpectation>    

Les structures SingleColumnValueCondition et CompositeColumnValueCondition se présentent comme suit.

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 satisfaite si la ligne existe. Elle ne l'est pas si la ligne n'existe pas.

  • EXPECT_NOT_EXIST : attend que la ligne n'existe pas. La condition est satisfaite si la ligne n'existe pas. Elle ne l'est pas si la ligne existe.

column_name

Nom de la colonne.

value

Valeur à comparer avec la colonne.

Le format est [Value, 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. Il est facultatif pour les autres valeurs.

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

comparator

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

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 boolean. 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 colonne pour la comparaison si la colonne possède plusieurs versions. Le type est boolean. 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 colonne sont utilisées pour la comparaison. Dans ce cas, si l'une des versions 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 selon les 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 selon les 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.