La función de actualización condicional permite actualizar datos en una tabla solo si se cumplen las condiciones especificadas. Si no se cumplen dichas condiciones, la actualización falla.
Requisitos previos
Se inicializó una instancia de OTSClient. Para obtener más información, consulte Initialize an OTSClient instance.
Se creó una tabla y se escribieron datos en ella. Para obtener más información, consulte Create a data table y Write data.
Notas de uso
Al invocar la operación PutRow, UpdateRow, DeleteRow o BatchWriteRow para actualizar datos, puede utilizar la actualización condicional para comprobar condiciones de existencia de fila y condiciones basadas en columnas. La actualización se realiza correctamente solo si se cumplen las condiciones.
La actualización condicional se puede ejecutar con base en condiciones de existencia de fila y condiciones basadas en columnas.
-
Las condiciones de existencia de fila incluyen IGNORE, EXPECT_EXIST y EXPECT_NOT_EXIST.
Cuando modifica una tabla, Tablestore comprueba primero la condición de existencia de fila. Si esta condición no se cumple, la modificación falla y se reporta un error.
-
Las condiciones basadas en columnas incluyen SingleColumnCondition y CompositeCondition, que determinan si se cumplen las condiciones según los valores de una o varias columnas.
Las condiciones basadas en columnas admiten los siguientes operadores relacionales: =, !=, >, >=, < y <=. También admiten los operadores lógicos NOT, AND y OR. Puede especificar hasta 10 condiciones basadas en columnas para una actualización condicional.
SingleColumnCondition admite la comparación entre una constante y una columna. No admite la comparación entre dos columnas ni entre dos constantes.
Los operadores lógicos combinan subcondiciones en CompositeCondition. Estas subcondiciones pueden ser SingleColumnCondition o CompositeCondition.
La actualización condicional permite implementar bloqueo optimista. Al actualizar una fila, debe obtener el valor de una columna específica y definir una condición de actualización basada en dicho valor. Por ejemplo, si desea cambiar el valor de la Columna A a 2, primero debe obtener su valor actual (supongamos que es 1). Luego, especifique que la fila solo se puede actualizar si el valor de la Columna A es 1. Si se cumple la condición, la actualización se realiza correctamente. Si otro cliente actualiza la fila antes, la operación falla.
Parámetros
|
Parámetro |
Descripción |
|
RowExistenceExpectation |
Condición de existencia de fila. Al modificar una tabla, Tablestore comprueba esta condición. 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. En Tablestore, RowExistenceExpectation_IGNORE especifica IGNORE, RowExistenceExpectation_EXPECT_EXIST especifica EXPECT_EXIST y RowExistenceExpectation_EXPECT_NOT_EXIST especifica EXPECT_NOT_EXIST.
|
|
columnName |
Nombre de la columna. |
|
columnValue |
Valor de comparación de la columna. |
|
comparator |
Operador relacional utilizado para comparar el valor de la columna. Para obtener información sobre los tipos de operadores relacionales, consulte ComparatorType. Los operadores relacionales incluyen EQUAL(=), NOT_EQUAL(!=), GREATER_THAN(>), GREATER_EQUAL(>=), LESS_THAN(<) y LESS_EQUAL(<=). En Tablestore, CT_EQUAL especifica EQUAL(=), CT_NOT_EQUAL especifica NOT_EQUAL(!=), CT_GREATER_THAN especifica GREATER_THAN(>), CT_GREATER_EQUAL especifica GREATER_EQUAL(>=), CT_LESS_THAN especifica LESS_THAN(<) y CT_LESS_EQUAL especifica LESS_EQUAL(<=). |
|
combinator |
Operador lógico que combina varias condiciones. Para obtener información sobre los tipos de operadores lógicos, consulte LogicalOperator. Los operadores lógicos incluyen NOT, AND y OR. En Tablestore, LO_NOT especifica NOT, LO_AND especifica AND y LO_OR especifica OR. El número de subcondiciones que puede especificar varía según el operador lógico utilizado.
|
|
passIfMissing |
Determina si se aprueba la comprobación condicional cuando una columna no existe en una fila. Este parámetro es de tipo booleano. El valor predeterminado es true, lo que indica que si la columna no existe, se aprueba la comprobación y la fila cumple las condiciones de actualización. Si establece el parámetro passIfMissing en false y la columna no existe en la fila, la comprobación falla y la fila no cumple las condiciones de actualización. |
|
latestVersionOnly |
Determina si se usa únicamente la versión más reciente del valor para la comparación cuando una columna tiene varias versiones. Este parámetro es de tipo booleano. El valor predeterminado es true, lo que indica que si existen múltiples versiones, solo se utiliza la más reciente para la comparación. Si establece el parámetro latestVersionOnly en false y la columna tiene varias versiones, se utilizan todas para la comparación. En este caso, si al menos una versión cumple la condición, se aprueba la comprobación y la fila cumple las condiciones de actualización. |
Ejemplos
Actualice una fila según la clave principal especificada. Si la fila indicada existe, el valor de la columna "name" es "john" y el valor de la columna "addr" es "china", la actualización se realiza correctamente. De lo contrario, la actualización falla.
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);
});