Você pode usar o recurso de atualização condicional para atualizar dados em uma tabela de dados somente se as condições especificadas forem atendidas. Se as condições não forem atendidas, a atualização falhará.
Pré-requisitos
-
Uma instância do OTSClient foi inicializada. Para mais informações, consulte Inicializar uma instância do OTSClient.
-
Uma tabela de dados foi criada e os dados foram gravados na tabela. Para mais informações, consulte Criar uma tabela de dados e Gravar dados.
Observações de uso
Ao chamar a operação PutRow, UpdateRow, DeleteRow ou BatchWriteRow para atualizar dados, você pode usar a atualização condicional para verificar condições de existência de linha e condições baseadas em colunas. A atualização será bem-sucedida somente se as condições forem atendidas.
A atualização condicional pode ser realizada com base em condições de existência de linha e condições baseadas em colunas.
-
As condições de existência de linha incluem IGNORE, EXPECT_EXIST e EXPECT_NOT_EXIST.
Ao modificar uma tabela de dados, o Tablestore verifica primeiro a condição de existência de linha. Se a condição de existência de linha não for atendida, a modificação falhará e um erro será retornado.
-
As condições baseadas em colunas incluem SingleColumnCondition e CompositeCondition, que são usadas para determinar se as condições são atendidas com base nos valores de uma ou mais colunas.
As condições baseadas em colunas oferecem suporte aos seguintes operadores relacionais: =, !=, >, >=, < e <=. As condições baseadas em colunas também oferecem suporte aos seguintes operadores lógicos: NOT, AND e OR. Você pode especificar até 10 condições baseadas em colunas para uma atualização condicional.
-
SingleColumnCondition oferece suporte à comparação entre uma constante e uma coluna. A coluna pode ser uma coluna de chave primária. SingleColumnCondition não oferece suporte à comparação entre duas colunas ou duas constantes.
-
Os operadores lógicos são usados para combinar subcondições em CompositeCondition. As subcondições podem ser SingleColumnCondition ou CompositeCondition.
-
Você pode usar a atualização condicional para realizar bloqueio otimista. Ao atualizar uma linha, você deve obter o valor de uma coluna específica e especificar uma condição de atualização de linha com base no valor da coluna. Por exemplo, ao atualizar o valor da Coluna A em uma linha para 2, você deve obter o valor da Coluna A. Neste exemplo, o valor obtido é 1. Em seguida, você deve especificar que a linha só pode ser atualizada se o valor da Coluna A for 1. Se a condição especificada for atendida, a atualização será bem-sucedida. Se a linha for atualizada por outro cliente, a atualização falhará.
Parâmetros
|
Parâmetro |
Descrição |
|
RowExistenceExpectation |
A condição de existência de linha. Ao modificar uma tabela, o Tablestore verifica a condição de existência de linha. Se a condição de existência de linha não for atendida, a modificação falhará e um erro será retornado. As condições de existência de linha incluem IGNORE, EXPECT_EXIST e EXPECT_NOT_EXIST. No Tablestore, RowExistenceExpectation_IGNORE é usado para especificar IGNORE, RowExistenceExpectation_EXPECT_EXIST é usado para especificar EXPECT_EXIST e RowExistenceExpectation_EXPECT_NOT_EXIST é usado para especificar EXPECT_NOT_EXIST.
|
|
columnName |
O nome da coluna. |
|
columnValue |
O valor de comparação da coluna. |
|
comparator |
O operador relacional usado para comparar o valor da coluna. Para informações sobre os tipos de operadores relacionais, consulte ComparatorType. Os operadores relacionais incluem EQUAL(=), NOT_EQUAL(!=), GREATER_THAN(>), GREATER_EQUAL(>=), LESS_THAN(<) e LESS_EQUAL(<=). No Tablestore, CT_EQUAL é usado para especificar EQUAL(=), CT_NOT_EQUAL é usado para especificar NOT_EQUAL(!=), CT_GREATER_THAN é usado para especificar GREATER_THAN(>), CT_GREATER_EQUAL é usado para especificar GREATER_EQUAL(>=), CT_LESS_THAN é usado para especificar LESS_THAN(<) e CT_LESS_EQUAL é usado para especificar LESS_EQUAL(<=). |
|
combinator |
O operador lógico que combina várias condições. Para informações sobre os tipos de operadores lógicos, consulte LogicalOperator. Os operadores lógicos incluem NOT, AND e OR. No Tablestore, LO_NOT é usado para especificar NOT, LO_AND é usado para especificar AND e LO_OR é usado para especificar OR. O número de subcondições que você pode especificar varia com base no operador lógico que você usa.
|
|
passIfMissing |
Especifica se a verificação condicional será aprovada quando uma coluna não existir em uma linha. O valor desse parâmetro é do tipo booleano. O valor padrão é true, que especifica que, se a coluna não existir em uma linha, a verificação condicional será aprovada e a linha atenderá às condições de atualização. Se você definir o parâmetro passIfMissing como false e a coluna não existir em uma linha, a verificação condicional falhará e a linha não atenderá às condições de atualização. |
|
latestVersionOnly |
Especifica se apenas a versão mais recente do valor será usada para comparação quando uma coluna tiver várias versões de valores. O valor desse parâmetro é do tipo booleano. O valor padrão é true, que especifica que, se a coluna tiver várias versões de valores, somente a versão mais recente do valor será usada para comparação. Se você definir o parâmetro latestVersionOnly como false e a coluna tiver várias versões de valores, todas as versões de valores serão usadas para comparação. Nesse caso, se pelo menos uma versão atender à condição, a verificação condicional será aprovada e a linha atenderá às condições de atualização. |
Exemplos
Atualize uma linha com base na chave primária especificada. Se a linha especificada existir, o valor da coluna "name" for "john" e o valor da coluna "addr" for "china", a atualização será bem-sucedida. Caso contrário, a atualização falhará.
var params = {
tableName: "sampleTable",
primaryKey: [{ 'gid': Long.fromNumber(20013) }, { 'uid': Long.fromNumber(20013) }],
updateOfAttributeColumns: [{ 'PUT': [{ 'col1': 'test6' }] }]
};
// Specify the update conditions. Specify that data can be updated only if the following conditions are met: the specified row exists, the value of the "name" column is "john", and the value of the "addr" column is "china".
var condition = new TableStore.CompositeCondition(TableStore.LogicalOperator.AND);
condition.addSubCondition(new TableStore.SingleColumnCondition('name', 'john', TableStore.ComparatorType.EQUAL));
condition.addSubCondition(new TableStore.SingleColumnCondition('addr', 'china', TableStore.ComparatorType.EQUAL));
params.condition = new TableStore.Condition(TableStore.RowExistenceExpectation.EXPECT_EXIST, condition);
client.updateRow(params,
function (err, data) {
if (err) {
console.log('error:', err);
return;
}
console.log('success:', data);
});