Todos os produtos
Search
Central de documentação

Tablestore:Atualizações condicionais

Última atualização: Sep 20, 2026

Você só pode atualizar dados em uma tabela de dados quando eles atendem à condição de coluna. Se os dados não atenderem à condição de coluna, a atualização falha.

Pré-requisitos

Descrição

O contêiner Condition armazena uma condição de existência de linha (rowExistenceExpectation), uma condição de coluna (columnCondition) ou ambas. Passe a condição configurada para setCondition() em RowPutChange, RowUpdateChange ou RowDeleteChange. Você também pode incluir essas alterações de linha em uma requisição BatchWriteRow. Se a condição não for atendida, o servidor retorna um erro e a linha permanece inalterada.

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

O exemplo a seguir atualiza a linha com a chave primária row1 na tabela condition_demo somente quando a linha existe. Caso contrário, o servidor retorna um erro.

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

Você pode usar atualizações condicionais como condição para as operações PutRow, UpdateRow, DeleteRow e BatchWriteRow.

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

Se você especificar apenas uma condição de existência de linha, use a seguinte estrutura abreviada.

    'condition' => <RowExistenceExpectation>    

As estruturas para SingleColumnValueCondition e CompositeColumnValueCondition são as seguintes.

Estrutura de SingleColumnValueCondition

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

Estrutura de CompositeColumnValueFilter

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

Parâmetro

Descrição

row_existence

Ao modificar uma tabela de dados, o sistema verifica primeiro a condição de existência da linha. Se a condição não for atendida, a modificação falha e o sistema reporta um erro.

As condições de existência de linha incluem IGNORE, EXPECT_EXIST e EXPECT_NOT_EXIST. Elas são representadas por RowExistenceExpectationConst::CONST_IGNORE, RowExistenceExpectationConst::CONST_EXPECT_EXIST e RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST.

  • IGNORE: Ignora a verificação. Não realiza nenhuma verificação de existência.

  • EXPECT_EXIST: A linha deve existir. A condição é atendida se a linha existir. A condição não é atendida se a linha não existir.

  • EXPECT_NOT_EXIST: A linha não deve existir. A condição é atendida se a linha não existir. A condição não é atendida se a linha existir.

column_name

O nome da coluna.

value

O valor a ser comparado com a coluna.

O formato é [Value, Type]. O tipo pode ser INTEGER, STRING (codificado em UTF-8), BINARY, BOOLEAN ou DOUBLE. Esses tipos são representados por ColumnTypeConst::CONST_INTEGER, ColumnTypeConst::CONST_STRING, ColumnTypeConst::CONST_BINARY, ColumnTypeConst::CONST_BOOLEAN e ColumnTypeConst::CONST_DOUBLE. O tipo para BINARY é obrigatório. Os tipos para outros valores são opcionais.

Se o tipo não for BINARY, você pode usar o formato abreviado Value.

comparator

O operador relacional usado para comparar o valor da coluna. Para mais informações sobre o tipo, consulte ComparatorType.

Os operadores relacionais incluem EQUAL (=), NOT_EQUAL (!=), GREATER_THAN (>), GREATER_EQUAL (>=), LESS_THAN (<) e LESS_EQUAL (<=). Eles são representados por ComparatorTypeConst::CONST_EQUAL, ComparatorTypeConst::CONST_NOT_EQUAL, ComparatorTypeConst::CONST_GREATER_THAN, ComparatorTypeConst::CONST_GREATER_EQUAL, ComparatorTypeConst::CONST_LESS_THAN e ComparatorTypeConst::CONST_LESS_EQUAL.

logical_operator

O operador lógico usado para combinar múltiplas condições. Para mais informações sobre o tipo, consulte LogicalOperator.

Os operadores lógicos incluem NOT, AND e OR. Eles são representados por LogicalOperatorConst::CONST_NOT, LogicalOperatorConst::CONST_AND e LogicalOperatorConst::CONST_OR.

O número de subcondições que você pode adicionar depende do operador lógico.

  • Se o operador lógico for NOT, você pode adicionar apenas uma subcondição.

  • Se o operador lógico for AND ou OR, você deve adicionar pelo menos duas subcondições.

pass_if_missing

Especifica se a verificação da condição é bem-sucedida caso a coluna não exista em uma linha. O tipo é booleano. O valor padrão é true. Isso significa que, se a coluna não existir em uma linha, a verificação da condição é bem-sucedida e a linha atende à condição de atualização.

Se você definir pass_if_missing como false, a verificação da condição falha caso a coluna não exista em uma linha. A linha não atende à condição de atualização.

latest_version_only

Especifica se o sistema usa apenas a versão mais recente do valor da coluna para comparação, caso a coluna tenha múltiplas versões. O tipo é booleano. O valor padrão é true. Isso significa que, se a coluna tiver múltiplas versões, apenas a versão mais recente é usada para comparação.

Se você definir latest_version_only como false e a coluna tiver múltiplas versões, todas as versões do valor da coluna são usadas para comparação. Nesse caso, se qualquer versão atender à condição, a verificação da condição é bem-sucedida e a linha atende à condição de atualização.

Exemplos

Executar operações de dados com base em condições de existência de linha

O exemplo a seguir mostra como executar uma operação em uma linha com base em sua chave primária e em uma condição de existência de linha especificada.

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

Executar operações de dados com base em condições de linha e coluna

O exemplo a seguir mostra como executar uma operação com base nas condições de linha e coluna.

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

Usar uma condição para implementar bloqueio otimista e incrementar uma coluna

O exemplo a seguir mostra como criar uma condição para implementar o bloqueio otimista e incrementar uma coluna.

    // 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 mais exemplos de código, consulte PutRow@GitHub, UpdateRow@GitHub, DeleteRow@GitHub e BatchWriteRow@GitHub.