条件付き更新機能を使用すると、指定された条件が満たされた場合にのみ、データテーブル内のデータを更新できます。条件が満たされない場合、更新は失敗します。
前提条件
-
OTSClientインスタンスが初期化されていること。詳細については、「OTSClient インスタンスの初期化」をご参照ください。 -
データテーブルが作成され、データテーブルにデータが書き込まれていること。詳細については、「データテーブルの作成」および「データの書き込み」をご参照ください。
注意事項
PutRow、UpdateRow、DeleteRow、または BatchWriteRow オペレーションを呼び出してデータテーブル内のデータを更新する場合、行の存在条件および列条件を指定して条件付き更新を実行できます。データテーブル内のデータは、条件が満たされた場合にのみ更新されます。
条件付き更新は、行の存在条件と列条件に基づいて実行できます。
-
次の行の存在条件がサポートされています:
IGNORE、EXPECT_EXIST、EXPECT_NOT_EXIST。データテーブルを更新する際、Tablestore はまず行の存在条件が満たされているかどうかを確認します。行の存在条件が満たされていない場合、更新は失敗し、エラーが報告されます。
-
列条件には
RelationalConditionとCompositeConditionが含まれ、1 つ以上の列の値に基づいて条件が満たされているかどうかを判断するために使用されます。列条件は、次の関係演算子をサポートしています:
=、!=、>、>=、<、<=。列条件は、次の論理演算子もサポートしています:NOT、AND、OR。条件付き更新には、最大 10 個の列条件を指定できます。-
RelationalConditionを使用すると、列と定数を比較できます。2 つの列または 2 つの定数の比較はサポートされていません。 -
CompositeConditionは、複数のRelationalConditionまたはCompositeConditionで構成されます。サブ条件間の論理関係を指定する必要があります。
-
条件付き更新を使用して、オプティミスティックロックを実装できます。行を更新する場合、特定の列の値を取得し、その列の値に基づいて行の更新条件を指定する必要があります。たとえば、行内の列 A の値を 2 に更新する場合、列 A の値を取得する必要があります。この例では、取得した値は 1 です。次に、列 A の値が 1 の場合にのみ行が更新されるよう指定する必要があります。指定された条件が満たされている場合、更新は成功します。行が別のクライアントによって更新された場合、更新は失敗します。
パラメーター
|
パラメーター |
説明 |
|
|
データテーブルを更新する際、Tablestore はまず行の存在条件が満たされているかどうかを確認します。行の存在条件が満たされていない場合、更新は失敗し、エラーが報告されます。 次の行の存在条件がサポートされています:
|
|
|
列の名前。 |
|
|
列と比較する値。 |
|
|
値を比較するために使用される関係演算子です。詳細については、「ComparatorType」をご参照ください。 次の関係演算子がサポートされています: |
|
|
複数の条件を組み合わせるために使用される論理演算子。詳細については、「論理演算子」をご参照ください。 次の論理演算子がサポートされています: 必要なサブ条件の数は、論理演算子によって異なります。
|
|
|
行に列が存在しない場合に条件チェックを通過するかどうかを指定します。このパラメーターの値はブールデータ型です。デフォルト値は
|
|
|
列に複数のバージョンの値がある場合に、最新バージョンの値のみを使用するかどうかを指定します。このパラメーターの値はブールデータ型です。デフォルト値は
|
例
次のサンプルコードは、列条件に基づいてデータを更新する方法の例を示しています。col0 列の値が 5 に等しい場合、データが更新されます。それ以外の場合、データの更新は失敗します。
// 行のプライマリキーを指定します。プライマリキーは、テーブルの作成時に `TableMeta` で指定されたプライマリキーと同じである必要があります。
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(0));
primaryKey.Add("pk1", new ColumnValue("abc"));
// 行の属性列を指定します。
AttributeColumns attribute = new AttributeColumns();
attribute.Add("col0", new ColumnValue(0));
attribute.Add("col1", new ColumnValue("a"));
attribute.Add("col2", new ColumnValue(true));
PutRowRequest request = new PutRowRequest(tableName, new Condition(RowExistenceExpectation.IGNORE), primaryKey, attribute);
// 他の条件が設定されていない場合に `PutRow` オペレーションを呼び出します。オペレーションは成功することが期待されます。
try
{
otsClient.PutRow(request);
Console.WriteLine("Put row succeeded.");
} catch (Exception ex)
{
Console.WriteLine("Put row failed. error:{0}", ex.Message);
}
// `col0` 列の値が `5` に等しくない場合、`PutRow` オペレーションを再度呼び出して元の値を上書きします。オペレーションは成功することが期待されます。
try
{
request.Condition.ColumnCondition = new RelationalCondition("col0",
CompareOperator.NOT_EQUAL,
new ColumnValue(5));
otsClient.PutRow(request);
Console.WriteLine("Put row succeeded.");
} catch (Exception ex)
{
Console.WriteLine("Put row failed. error:{0}", ex.Message);
}
// `col0` 列の値が `5` に等しい場合、`PutRow` オペレーションを再度呼び出して元の値を上書きします。オペレーションは失敗することが期待されます。
try
{
// `col0` 列の値が `5` に等しいという新しい条件を追加します。
request.Condition.ColumnCondition = new RelationalCondition("col0",
CompareOperator.EQUAL,
new ColumnValue(5));
otsClient.PutRow(request);
Console.WriteLine("Put row succeeded.");
}
catch (OTSServerException)
{
// 条件が満たされていないため、`OTSServerException` が返されます。
Console.WriteLine("Put row failed because condition check failed. but expected");
}
catch (Exception ex)
{
Console.WriteLine("Put row failed. error:{0}", ex.Message);
}