Tablestore では、異なる操作を呼び出すことで、単一行のデータの書き込み、単一行のデータの更新、複数行のデータの同時書き込みを行うことができます。データテーブルにデータを書き込むには、完全なプライマリキー情報と、追加、削除、または変更する属性列を指定する必要があります。高並列アプリケーションにデータを書き込む場合は、行の有無の条件または列ベースの条件を設定して、指定した条件に基づいてデータを更新できます。
メソッド
Tablestoreは、PutRow、UpdateRow、およびBatchWriteRow操作を提供し、データの書き込みを可能にします。データを書き込む前に、ビジネス要件に基づいて適切な書き込みメソッドを選択してください。
書き込みメソッド | 説明 | シナリオ |
PutRow 操作を呼び出して、単一のデータ行を挿入できます。行が既に存在する場合、Tablestore は既存の行のすべての列にあるすべてのバージョンのデータを削除し、新しいデータを書き込みます。 | この操作は、少量のデータを書き込むシナリオに適しています。 | |
UpdateRow 操作を呼び出して、単一のデータ行を更新できます。行に属性列を追加したり、行から属性列を削除したり、属性列から特定のバージョンのデータを削除したり、属性列の値を更新したりできます。行が存在しない場合は、新しい行が挿入されます。 | この操作は、既存のデータを更新するシナリオに適しています。たとえば、属性列を削除したり、特定のバージョンのデータを削除したり、属性列の値を更新したりする場合です。 | |
BatchWriteRow 操作を呼び出して、複数のテーブルに複数のデータ行を同時に書き込むことができます。 BatchWriteRow操作は、複数のPutRow、UpdateRow、およびDeleteRow操作で構成されます。BatchWriteRow操作を呼び出す場合、サブ操作を構築するプロセスは、PutRow、UpdateRow、またはDeleteRow操作を呼び出すプロセスと同じです。 | この操作は、大量のデータを書き込み、削除、または更新するシナリオ、およびデータを同時に書き込み、削除、および更新するシナリオに適しています。 |
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成およびデータの書き込みを参照してください。
単一行のデータの挿入
API操作
/// <summary>
/// 指定されたテーブル名、プライマリキー、および属性に基づいてデータの行を書き込みます。操作で消費される容量ユニット(CU)の数が返されます。
/// </summary>
/// <param name="request">データ挿入リクエスト</param>
/// <returns>操作で消費されるCUの数</returns>
public PutRowResponse PutRow(PutRowRequest request);
/// <summary>
/// PutRowの非同期モード。
/// </summary>
public Task<PutRowResponse> PutRowAsync(PutRowRequest request);
パラメーター
パラメーター | 説明 |
tableName | データテーブルの名前。 |
primaryKey | 行に関するプライマリキー情報。このパラメーターの値は、各プライマリキー列の名前、タイプ、および値で構成されます。 重要
|
attribute | 行の属性列。各属性列は、属性列名、属性列タイプ(オプション)、属性列値、およびタイムスタンプ(オプション)の順序でパラメーターによって指定されます。
|
condition | 操作を実行するために満たす必要がある条件。行存在条件または列値に基づく条件を指定できます。詳細については、条件付き更新の実行を参照してください。 説明
|
例
データ行の挿入
次のサンプルコードは、単一行のデータを挿入する方法の例を示しています。
// 行のプライマリキーを指定します。プライマリキーのスキーマは、テーブルの作成時にTableMetaで指定されたスキーマと同じである必要があります。
var primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(0));
primaryKey.Add("pk1", new ColumnValue("abc"));
// 行の属性列を指定します。
var attribute = new AttributeColumns();
attribute.Add("col0", new ColumnValue(0));
attribute.Add("col1", new ColumnValue("a"));
attribute.Add("col2", new ColumnValue(true));
try
{
// データ行を挿入するためのリクエストオブジェクトを構築します。RowExistenceExpectation.IGNOREは、指定された行が存在するかどうかに関係なくデータが挿入されることを指定します。
var request = new PutRowRequest("SampleTable", new Condition(RowExistenceExpectation.IGNORE),
primaryKey, attribute);
// PutRow操作を呼び出してデータを挿入します。
otsClient.PutRow(request);
// 操作が成功すると、例外は返されません。
Console.WriteLine("Put row succeeded.");
}
catch (Exception ex)
{
// 操作が失敗すると、例外が返されます。例外を処理します。
Console.WriteLine("Put row failed, exception:{0}", ex.Message);
}
詳細なサンプルコードについては、PutRow@GitHubをご覧ください。
データ行を挿入する際に、列値に基づく条件と行存在条件を指定する
次のサンプルコードは、行が存在し、col0列の値が24より大きい場合にのみデータ行を挿入する方法の例を示しています。
// 行のプライマリキーを指定します。プライマリキーのスキーマは、テーブルの作成時にTableMetaで指定されたスキーマと同じである必要があります。
var 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));
// col0列の値が24より大きい場合、元の値を上書きするために、行を挿入できます。
try
{
var request = new PutRowRequest("SampleTable", new Condition(RowExistenceExpectation.EXPECT_EXIST),
primaryKey, attribute);
request.Condition.ColumnCondition = new RelationalCondition("col0",
CompareOperator.GREATER_THAN,
new ColumnValue(24));
otsClient.PutRow(request);
Console.WriteLine("Put row succeeded.");
}
catch (Exception ex)
{
Console.WriteLine("Put row failed. error:{0}", ex.Message);
}
詳細なサンプルコードについては、ConditionPutRow@GitHubをご覧ください。
データを非同期に挿入する
次のサンプルコードは、複数行のデータを非同期に挿入する方法の例を示しています。
各非同期呼び出しはスレッドを開始します。多数の非同期呼び出しが連続して開始され、各呼び出しに長時間を要する場合は、タイムアウトエラーが発生する可能性があります。
try
{
var putRowTaskList = new List<Task<PutRowResponse>>();
for (int i = 0; i < 100; i++)
{
// 行のプライマリキーを指定します。プライマリキーのスキーマは、テーブルの作成時にTableMetaで指定されたスキーマと同じである必要があります。
var primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(i));
primaryKey.Add("pk1", new ColumnValue("abc"));
// 行の属性列を指定します。
var attribute = new AttributeColumns();
attribute.Add("col0", new ColumnValue(i));
attribute.Add("col1", new ColumnValue("a"));
attribute.Add("col2", new ColumnValue(true));
var request = new PutRowRequest("SampleTable", new Condition(RowExistenceExpectation.IGNORE),
primaryKey, attribute);
putRowTaskList.Add(otsClient.PutRowAsync(request));
}
// 各非同期呼び出しが結果を返し、消費されたCUを表示するまで待機します。
foreach (var task in putRowTaskList)
{
task.Wait();
Console.WriteLine("consumed read:{0}, write:{1}", task.Result.ConsumedCapacityUnit.Read,
task.Result.ConsumedCapacityUnit.Write);
}
// 操作が成功すると、例外は返されません。
Console.WriteLine("Put row async succeeded.");
}
catch (Exception ex)
{
// 操作が失敗すると、例外が返されます。例外を処理します。
Console.WriteLine("Put row async failed. exception:{0}", ex.Message);
}
詳細なサンプルコードについては、PutRowAsync@GitHubをご覧ください。
1 行のデータの更新
API 操作
/// <summary>
/// 特定の行のデータを更新するためにこの操作を呼び出すことができます。行が存在しない場合は、新しい行が追加されます。行が存在する場合は、リクエストの内容に基づいて、指定された列の値が追加、変更、または削除されます。
/// </summary>
/// <param name="request">リクエストインスタンス。</param>
public UpdateRowResponse UpdateRow(UpdateRowRequest request);
/// <summary>
/// UpdateRow の非同期モード。
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public Task<UpdateRowResponse> UpdateRowAsync(UpdateRowRequest request);
パラメーター
パラメーター | 説明 |
tableName | データテーブルの名前。 |
primaryKey | 行のプライマリキー情報。このパラメーターの値は、各プライマリキー列の名前、型、および値で構成されます。 重要 指定するプライマリキー列の数と型は、テーブルのプライマリキー列の実際の数と型と同じである必要があります。 |
condition | 操作を実行するために満たす必要がある条件。行存在条件または列値に基づく条件を指定できます。詳細については、条件付き更新の実行を参照してください。 |
attribute | 更新する属性列。 |
例
次のサンプルコードは、1 行のデータを更新する方法の例を示しています。
// 行のプライマリキーを指定します。プライマリキーのスキーマは、テーブルの作成時に TableMeta で指定されたスキーマと同じである必要があります。
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(0));
primaryKey.Add("pk1", new ColumnValue("abc"));
// 行の属性列を指定します。
UpdateOfAttribute attribute = new UpdateOfAttribute();
attribute.AddAttributeColumnToPut("col0", new ColumnValue(0));
attribute.AddAttributeColumnToPut("col1", new ColumnValue("b")); // 列の値を a から b に変更します。
attribute.AddAttributeColumnToPut("col2", new ColumnValue(true));
try
{
// 行を更新するためのリクエストオブジェクトを構築します。RowExistenceExpectation.IGNORE は、指定された行が存在するかどうかに関係なくデータが更新されることを指定します。
var request = new UpdateRowRequest("SampleTable", new Condition(RowExistenceExpectation.IGNORE),
primaryKey, attribute);
// UpdateRow 操作を呼び出してデータを更新します。
otsClient.UpdateRow(request);
// 操作が成功した場合、例外は返されません。
Console.WriteLine("Update row succeeded.");
}
catch (Exception ex)
{
// 操作が失敗した場合、例外が返されます。例外を処理します。
Console.WriteLine("Update row failed, exception:{0}", ex.Message);
}
詳細なサンプルコードについては、UpdateRow@GitHubをご覧ください。
複数行のデータを同時に書き込む
使用上の注意
API操作
/// <summary>
/// <para>1つ以上のテーブルの複数行のデータを挿入、変更、または削除します。</para>
/// <para>BatchWriteRow操作は、複数のPutRow、UpdateRow、およびDeleteRow操作のセットです。個々の操作の実行、結果の返却、および容量ユニット(CU)の消費は、独立して実行されます。</para>
/// <para>多数の単一行書き込み操作の実行と比較して、BatchWriteRowを使用すると、リクエストの応答時間を短縮し、データ書き込み速度を向上させることができます。</para>
/// </summary>
/// <param name="request">リクエストインスタンス。</param>
/// <returns>レスポンスインスタンス</returns>
public BatchWriteRowResponse BatchWriteRow(BatchWriteRowRequest request);
/// <summary>
/// BatchWriteRowの非同期モード。
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public Task<BatchWriteRowResponse> BatchWriteRowAsync(BatchWriteRowRequest request);
例
次のサンプルコードは、100行のデータを同時に書き込む方法の例を示しています。
var TableName = "SampleTable";
// 100 行のデータを同時に書き込むリクエストオブジェクトを構築します。100 行のデータのプライマリキーを指定します。
var request = new BatchWriteRowRequest();
var rowChanges = new RowChanges(TableName);
for (int i = 0; i < 100; i++)
{
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(i));
primaryKey.Add("pk1", new ColumnValue("abc"));
// 行の属性列を指定します。
UpdateOfAttribute attribute = new UpdateOfAttribute();
attribute.AddAttributeColumnToPut("col0", new ColumnValue(0));
attribute.AddAttributeColumnToPut("col1", new ColumnValue("a"));
attribute.AddAttributeColumnToPut("col2", new ColumnValue(true));
rowChanges.AddUpdate(new Condition(RowExistenceExpectation.IGNORE), primaryKey, attribute);
}
request.Add(TableName, rowChanges);
try
{
// BatchWriteRow 操作を呼び出します。
var response = otsClient.BatchWriteRow(request);
var tableRows = response.TableRespones;
var rows = tableRows[TableName];
// 複数行のデータを同時に書き込む場合、一部の行の書き込みに失敗する可能性があります。戻り値を確認し、各行のステータスが成功かどうかを確認する必要があります。詳細については、サンプルコード内のGitHubのリンクを参照してください。
}
catch (Exception ex)
{
// 操作が失敗した場合、例外が返されます。例外を処理します。
Console.WriteLine("Batch put row failed, exception:{0}", ex.Message);
}
詳細なサンプルコードについては、BatchWriteRow@GitHubをご覧ください。
FAQ
参照資料
指定された条件に基づいて高並行アプリケーションのデータを更新するには、条件付き更新機能を使用できます。詳細については、条件付き更新の実行を参照してください。
さまざまなトピックのページビュー(PV)数など、オンラインアプリケーションに関するリアルタイム統計を収集するには、アトミックカウンター機能を使用できます。詳細については、アトミックカウンター機能の使用を参照してください。
テーブルにデータを書き込んだ後、ビジネス要件に基づいてテーブル内のデータを読み取ったり削除したりできます。詳細については、データの読み取りとデータの削除を参照してください。