Todos los productos
Search
Centro de documentos

Tablestore:Actualizaciones condicionales

Última actualización: Sep 20, 2026

Los datos de una tabla se actualizan únicamente cuando cumplen la condición de columna. Si no la cumplen, la actualización falla.

Requisitos previos

Descripción

El contenedor Condition almacena una condición de existencia de fila (rowExistenceExpectation), una condición de columna (columnCondition) o ambas. Pase la condición configurada a setCondition() en RowPutChange, RowUpdateChange o RowDeleteChange. Estos cambios de fila también se pueden incluir en una solicitud BatchWriteRow. Si no se cumple la condición, el servidor devuelve un error y la fila permanece sin cambios.

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

A continuación se muestra un ejemplo que actualiza la fila con la clave principal row1 en la tabla condition_demo solo si la fila existe. De lo contrario, el servidor devuelve un error.

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

Parámetros

Las actualizaciones condicionales se utilizan como condición para las operaciones PutRow, UpdateRow, DeleteRow y BatchWriteRow.

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

Si solo se especifica una condición de existencia de fila, utilice la siguiente estructura abreviada.

    'condition' => <RowExistenceExpectation>    

A continuación se muestran las estructuras de SingleColumnValueCondition y CompositeColumnValueCondition.

Estructura de SingleColumnValueCondition

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

Estructura de CompositeColumnValueFilter

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

Parámetro

Descripción

row_existence

Cuando se modifica una tabla de datos, el sistema comprueba primero la condición de existencia de fila. Si no se cumple, la modificación falla y se reporta un error.

Las condiciones de existencia de fila incluyen IGNORE, EXPECT_EXIST y EXPECT_NOT_EXIST. Se representan mediante RowExistenceExpectationConst::CONST_IGNORE, RowExistenceExpectationConst::CONST_EXPECT_EXIST y RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST.

  • IGNORE: omite la comprobación. No se verifica la existencia de la fila.

  • EXPECT_EXIST: espera que la fila exista. La condición se cumple si la fila existe y no se cumple si la fila no existe.

  • EXPECT_NOT_EXIST: espera que la fila no exista. La condición se cumple si la fila no existe y no se cumple si la fila existe.

column_name

Nombre de la columna.

value

Valor con el que se compara la columna.

El formato es [Value, Type]. El tipo puede ser INTEGER, STRING (con codificación UTF-8), BINARY, BOOLEAN o DOUBLE. Estos valores se representan mediante ColumnTypeConst::CONST_INTEGER, ColumnTypeConst::CONST_STRING, ColumnTypeConst::CONST_BINARY, ColumnTypeConst::CONST_BOOLEAN y ColumnTypeConst::CONST_DOUBLE. El tipo para BINARY es obligatorio; para los demás valores, opcional.

Si el tipo no es BINARY, utilice el formato abreviado Value.

comparator

Operador relacional que se utiliza para comparar el valor de la columna. Para obtener más información sobre el tipo, consulte ComparatorType.

Los operadores relacionales incluyen EQUAL (=), NOT_EQUAL (!=), GREATER_THAN (>), GREATER_EQUAL (>=), LESS_THAN (<) y LESS_EQUAL (<=). Se representan mediante ComparatorTypeConst::CONST_EQUAL, ComparatorTypeConst::CONST_NOT_EQUAL, ComparatorTypeConst::CONST_GREATER_THAN, ComparatorTypeConst::CONST_GREATER_EQUAL, ComparatorTypeConst::CONST_LESS_THAN y ComparatorTypeConst::CONST_LESS_EQUAL.

logical_operator

Operador lógico que combina varias condiciones. Para obtener más información sobre el tipo, consulte LogicalOperator.

Los operadores lógicos incluyen NOT, AND y OR. Se representan mediante LogicalOperatorConst::CONST_NOT, LogicalOperatorConst::CONST_AND y LogicalOperatorConst::CONST_OR.

La cantidad de subcondiciones que se agregan depende del operador lógico.

  • Si el operador lógico es NOT, solo se agrega una subcondición.

  • Si el operador lógico es AND u OR, agregue como mínimo dos subcondiciones.

pass_if_missing

Indica si la comprobación de la condición se aprueba cuando la columna no existe en una fila. El tipo es booleano y el valor predeterminado es true. Esto significa que, si la columna no existe en la fila, la comprobación se aprueba y la fila cumple la condición de actualización.

Si establece pass_if_missing en false, la comprobación falla cuando la columna no existe en la fila. En ese caso, la fila no cumple la condición de actualización.

latest_version_only

Indica si se usa únicamente la versión más reciente del valor de la columna para la comparación cuando existen varias versiones. El tipo es booleano y el valor predeterminado es true. Es decir, si la columna tiene varias versiones, solo se utiliza la más reciente para la comparación.

Si establece latest_version_only en false y la columna tiene varias versiones, todas ellas se usan para la comparación. En este caso, basta con que una versión cumpla la condición para que la comprobación se apruebe y la fila cumpla la condición de actualización.

Ejemplos

Operaciones de datos basadas en condiciones de existencia de fila

En el siguiente ejemplo se muestra cómo ejecutar una operación en una fila según su clave principal y una condición de existencia de fila específica.

$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";
      }
    }
  }

Operaciones de datos basadas en condiciones de fila y de columna

En el siguiente ejemplo se muestra cómo ejecutar una operación basada en condiciones de fila y de columna.

$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";
      }
    }
  }

Uso de una condición para implementar bloqueo optimista e incrementar una columna

En el siguiente ejemplo se muestra cómo construir una condición para implementar un bloqueo optimista e incrementar una columna.

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

Para consultar más ejemplos de código, visite PutRow@GitHub, UpdateRow@GitHub, DeleteRow@GitHub y BatchWriteRow@GitHub.