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
El cliente está inicializado. Para obtener más información, consulte Initialize the Tablestore client.
Se creó una tabla de datos y se escribieron datos en ella. Para obtener más información, consulte Create a data table.
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.
|
|
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.
|
|
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.