Vous ne pouvez mettre à jour les données d'une table que si elles satisfont la condition de colonne spécifiée. Si les données ne remplissent pas cette condition, la mise à jour échoue.
Prérequis
Le client est initialisé. Pour plus d'informations, consultez la rubrique Initialiser le client Tablestore.
Une table de données est créée et contient des données. Pour plus d'informations, consultez la rubrique Créer une table de données.
Description
Le conteneur Condition contient une condition d'existence de ligne (rowExistenceExpectation), une condition de colonne (columnCondition), ou les deux. Transmettez la condition configurée à la méthode setCondition() des objets RowPutChange, RowUpdateChange ou RowDeleteChange. Ces modifications de ligne peuvent également être incluses dans une requête BatchWriteRow. Si la condition n'est pas satisfaite, le serveur renvoie une erreur et la ligne reste inchangée.
rowChange.setCondition(condition)
new SingleColumnValueCondition(columnName, operator, columnValue)
new CompositeColumnValueCondition(logicOperator)
L'exemple suivant met à jour la ligne dont la clé primaire est row1 dans la table condition_demo uniquement si la ligne existe. Dans le cas contraire, le serveur renvoie une erreur.
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));
Paramètres
Les mises à jour conditionnelles s'appliquent aux opérations PutRow, UpdateRow, DeleteRow et BatchWriteRow.
'condition' => [
'row_existence' => <RowExistenceExpectation>
'column_condition' => <ColumnCondition>
]
Si seule une condition d'existence de ligne est spécifiée, utilisez la structure abrégée suivante.
'condition' => <RowExistenceExpectation>
Les structures SingleColumnValueCondition et CompositeColumnValueCondition se présentent comme suit.
Structure SingleColumnValueCondition
[
'column_name' => '<string>',
'value' => <ColumnValue>,
'comparator' => <ComparatorType>,
'pass_if_missing' => true || false,
'latest_version_only' => true || false
]
Structure CompositeColumnValueFilter
[
'logical_operator' => <LogicalOperator>
'sub_conditions' => [
<ColumnCondition>,
<ColumnCondition>,
<ColumnCondition>,
// other conditions
]
]
|
Paramètre |
Description |
|
row_existence |
Lorsque vous modifiez une table de données, le système vérifie d'abord la condition d'existence de la ligne. Si la condition n'est pas remplie, la modification échoue et une erreur est signalée. Les conditions d'existence de ligne incluent IGNORE, EXPECT_EXIST et EXPECT_NOT_EXIST. Elles sont représentées par RowExistenceExpectationConst::CONST_IGNORE, RowExistenceExpectationConst::CONST_EXPECT_EXIST et RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST.
|
|
column_name |
Nom de la colonne. |
|
value |
Valeur à comparer avec la colonne. Le format est [Value, Type]. Le type peut être INTEGER, STRING (encodé en UTF-8), BINARY, BOOLEAN ou DOUBLE. Ces types sont représentés par ColumnTypeConst::CONST_INTEGER, ColumnTypeConst::CONST_STRING, ColumnTypeConst::CONST_BINARY, ColumnTypeConst::CONST_BOOLEAN et ColumnTypeConst::CONST_DOUBLE. Le type est obligatoire pour BINARY. Il est facultatif pour les autres valeurs. Si le type n'est pas BINARY, vous pouvez utiliser le format abrégé Value. |
|
comparator |
Opérateur relationnel utilisé pour comparer la valeur de la colonne. Pour plus d'informations sur le type, consultez ComparatorType. Les opérateurs relationnels incluent EQUAL (=), NOT_EQUAL (!=), GREATER_THAN (>), GREATER_EQUAL (>=), LESS_THAN (<) et LESS_EQUAL (<=). Ils sont représentés par ComparatorTypeConst::CONST_EQUAL, ComparatorTypeConst::CONST_NOT_EQUAL, ComparatorTypeConst::CONST_GREATER_THAN, ComparatorTypeConst::CONST_GREATER_EQUAL, ComparatorTypeConst::CONST_LESS_THAN et ComparatorTypeConst::CONST_LESS_EQUAL. |
|
logical_operator |
Opérateur logique utilisé pour combiner plusieurs conditions. Pour plus d'informations sur le type, consultez LogicalOperator. Les opérateurs logiques incluent NOT, AND et OR. Ils sont représentés par LogicalOperatorConst::CONST_NOT, LogicalOperatorConst::CONST_AND et LogicalOperatorConst::CONST_OR. Le nombre de sous-conditions que vous pouvez ajouter dépend de l'opérateur logique.
|
|
pass_if_missing |
Indique si la vérification de la condition réussit lorsque la colonne n'existe pas dans une ligne. Le type est boolean. La valeur par défaut est true. Cela signifie que si la colonne n'existe pas dans une ligne, la vérification de la condition réussit et la ligne satisfait la condition de mise à jour. Si vous définissez pass_if_missing sur false, la vérification de la condition échoue lorsque la colonne n'existe pas dans une ligne. La ligne ne satisfait pas la condition de mise à jour. |
|
latest_version_only |
Indique s'il faut utiliser uniquement la dernière version de la valeur de colonne pour la comparaison si la colonne possède plusieurs versions. Le type est boolean. La valeur par défaut est true. Cela signifie que si la colonne possède plusieurs versions, seule la dernière version est utilisée pour la comparaison. Si vous définissez latest_version_only sur false et que la colonne possède plusieurs versions, toutes les versions de la valeur de colonne sont utilisées pour la comparaison. Dans ce cas, si l'une des versions satisfait la condition, la vérification de la condition réussit et la ligne satisfait la condition de mise à jour. |
Exemples
Effectuer des opérations de données selon les conditions d'existence de ligne
L'exemple suivant montre comment effectuer une opération sur une ligne en fonction de sa clé primaire et d'une condition d'existence de ligne spécifiée.
$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";
}
}
}
Effectuer des opérations de données selon les conditions de ligne et de colonne
L'exemple suivant montre comment effectuer une opération basée sur des conditions de ligne et de colonne.
$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";
}
}
}
Utiliser une condition pour implémenter le verrouillage optimiste et incrémenter une colonne
L'exemple suivant montre comment créer une condition pour implémenter le verrouillage optimiste et incrémenter une colonne.
// 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);
Pour plus d'exemples de code, consultez PutRow@GitHub, UpdateRow@GitHub, DeleteRow@GitHub et BatchWriteRow@GitHub.