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
O cliente está inicializado. Para mais informações, consulte Initialize the Tablestore client.
Você criou uma tabela de dados e gravou dados nela. Para mais informações, consulte Create a data table.
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.
|
|
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.
|
|
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.