すべてのプロダクト
Search
ドキュメントセンター

Tablestore:データの書き込み

最終更新日:Mar 01, 2026

Tablestore は、テーブルにデータを書き込むための 3 つの操作を提供します:PutRowUpdateRow、および BatchWriteRow です。

説明

行はテーブルの基本単位です。各行は、プライマリキー列とオプションの属性列で構成されます。プライマリキー列の名前と型は、テーブル内のすべての行で同じです。属性列は行ごとに異なる場合があります。詳細については、「概要」をご参照ください。

操作

操作スコープ動作
PutRow単一行行を挿入します。同じプライマリキーを持つ行が存在する場合、すべての列のすべてのバージョンのデータを削除し、新しいデータを書き込みます。
UpdateRow単一行属性列を追加、更新、または削除します。列から特定のバージョンのデータを削除します。行が存在しない場合は、新しい行を挿入します (リクエストが列の削除のみである場合を除く)。
BatchWriteRow複数行1 つ以上のテーブルにまたがる単一のリクエストで、複数の PutRow、UpdateRow、および DeleteRow サブオペレーションを組み合わせます。各サブオペレーションは独立して実行され、応答されます。

共通設定

データを書き込む前に、任意の書き込み操作に対して次のオプション設定を構成できます:

  • データバージョン番号:デフォルトでは、Tablestore は現在の UNIX タイムスタンプ (UTC の 1970年1月1日 00:00:00 からのミリ秒) をバージョン番号として使用します。必要に応じて、カスタムのバージョン番号を指定します。詳細については、「データバージョンと TTL」をご参照ください。

  • 条件付き更新:行の存在条件または列の値に基づく条件を設定します。詳細については、「条件付き更新」をご参照ください。

PutRow の応答

  • 成功すると、Tablestore は消費された容量単位 (CU) の数を返します。

  • 失敗すると、Tablestore はエラーコード (例:パラメーター検証の失敗、行データの超過、または行の存在チェックの失敗) を返します。

説明

エラーコードの詳細については、「エラーコード」をご参照ください。

BatchWriteRow の部分的な失敗の処理

BatchWriteRow リクエストで一部の行が失敗した場合、Tablestore は例外をスローしません。代わりに、失敗した行に関する情報を含む BatchWriteRowResponse を返します。常に isAllSucceed メソッドを呼び出して、すべての行が正常に書き込まれたかどうかを確認してください。

サーバーが一部の操作で無効なパラメーターを検出した場合、リクエスト内のどの操作も実行する前にエラーを返すことがあります。

BatchWriteRow は、操作ごとの条件もサポートしています。各 PutRow、UpdateRow、または DeleteRow サブオペレーションに対して、更新条件を個別に構成します。

Tablestore コンソールの使用

Tablestore コンソールは、単一行のデータの挿入と更新をサポートしています。

  1. Tablestore コンソールにログインします。

  2. [概要] ページで、対象のインスタンスを見つけ、[操作] 列の [インスタンスの管理] をクリックします。

  3. インスタンスの詳細」タブ内の「テーブル」タブで、対象テーブルの名前をクリックします。

  4. [テーブルの管理] ページの [データのクエリ] タブで、データを挿入または更新します。

単一行の挿入

  1. [挿入] をクリックします。

  2. [挿入] ダイアログボックスで、[プライマリキー値] 列に値を入力します。

  3. image アイコンをクリックし、[名前]、[タイプ]、[値]、および [バージョン] パラメーターを構成します。複数の属性列を追加するには、image アイコンを毎回クリックして列を追加し、そのパラメーターを構成します。

  4. [OK] をクリックします。

単一行の更新

  1. 更新する行を選択し、[更新] をクリックします。

  2. [更新] ダイアログボックスで、属性列を変更します:

    • 列の追加:image アイコンをクリックし、パラメーターを構成します。

    • 列を削除: [すべて削除][操作] ドロップダウンリストから選択します。

    • 特定のバージョンの削除:[操作] ドロップダウンリストから [削除] を選択し、削除するバージョン番号を選択します。

    • 値の更新:[操作] ドロップダウンリストから [更新] を選択し、値を変更します。

  3. [OK] をクリックします。

Tablestore CLI の使用

行の挿入

put コマンドを実行します。詳細については、「データの挿入」をご参照ください。

次の例では、最初のプライマリキー列が 86 で、2 番目のプライマリキー列が 6771 の行を挿入します。この行には、name と country という 2 つの STRING 型の属性列があります。

put --pk '["86", 6771]' --attr '[{"c":"name", "v":"redchen"}, {"c":"country", "v":"china"}]'

行の更新

update コマンドを実行します。詳細については、「データの更新」をご参照ください。

次の例では、最初のプライマリキー列が 86 で、2 番目のプライマリキー列が 6771 の行を更新します。--condition ignore フラグは、行が存在するかどうかに関係なくデータを挿入します。行が存在する場合、新しいデータが既存のデータを上書きします。

update --pk '["86", 6771]' --attr '[{"c":"name", "v":"redchen"}, {"c":"country", "v":"china"}]' --condition 無視

Tablestore SDK の使用

次のいずれかの SDK を使用してデータを書き込みます:Tablestore SDK for JavaTablestore SDK for GoTablestore SDK for PythonTablestore SDK for Node.jsTablestore SDK for .NET、または Tablestore SDK for PHP

次の例では、Java SDK を使用します。

単一行の挿入

PutRow は、システム生成のバージョン番号、カスタムバージョン番号、および条件付き書き込みをサポートしています。

システム生成のバージョン番号

10 個の属性列を持つ行を挿入し、それぞれが 1 つのバージョンのデータを格納します。システムはバージョン番号を自動的に生成します。

private static void putRow(SyncClient client, String pkValue) {
    // プライマリキーを構築します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // テーブルの名前を指定します。
    RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);

    // 属性列を追加します。
    for (int i = 0; i < 10; i++) {
        rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
    }

    client.putRow(new PutRowRequest(rowPutChange));
}

カスタムバージョン番号

10 個の属性列を持つ行を挿入し、それぞれがカスタムバージョン番号を持つ 3 つのバージョンのデータを格納します。

private static void putRow(SyncClient client, String pkValue) {
    // プライマリキーを構築します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // テーブルの名前を指定します。
    RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);

    // 属性列を追加します。
    long ts = System.currentTimeMillis();
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 3; j++) {
            rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
        }
    }

    client.putRow(new PutRowRequest(rowPutChange));
}

行の存在条件

指定された行が存在しない場合にのみ、10 個の属性列 (各 3 バージョン) を持つ行を挿入します。

private static void putRow(SyncClient client, String pkValue) {
    // プライマリキーを構築します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // テーブルの名前を指定します。
    RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);

    // 指定された行が存在しないことを期待する行の存在条件を指定します。
    rowPutChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST));

    // 属性列を追加します。
    long ts = System.currentTimeMillis();
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 3; j++) {
            rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
        }
    }

    client.putRow(new PutRowRequest(rowPutChange));
}

行の存在条件と列の値の条件

行が存在し、Col0 の値が 100 より大きい場合に、10 個の属性列 (各 3 バージョン) を持つ行を挿入します。

private static void putRow(SyncClient client, String pkValue) {
    // プライマリキーを構築します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // テーブルの名前を指定します。
    RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);

    // 指定された行が存在し、Col0 列の値が 100 より大きいことを期待する行の存在条件と列ベースの条件を指定します。
    Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
    condition.setColumnCondition(new SingleColumnValueCondition("Col0",
            SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
    rowPutChange.setCondition(condition);

    // 属性列を追加します。
    long ts = System.currentTimeMillis();
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 3; j++) {
            rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
        }
    }

    client.putRow(new PutRowRequest(rowPutChange));
}

単一行の更新

UpdateRow は、無条件の更新と、行の存在および列の値に基づく条件付き更新をサポートしています。

条件なしの更新

複数の列を更新し、列から特定のバージョンのデータを削除し、列を削除します。

private static void updateRow(SyncClient client, String pkValue) {
    // プライマリキーを構築します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // テーブルの名前を指定します。
    RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);

    // 列を更新します。
    for (int i = 0; i < 10; i++) {
        rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
    }

    // 列から特定のバージョンのデータを削除します。
    rowUpdateChange.deleteColumn("Col10", 1465373223000L);

    // 列を削除します。
    rowUpdateChange.deleteColumns("Col11");

    client.updateRow(new UpdateRowRequest(rowUpdateChange));
}

行の存在条件と列の値の条件

行が存在し、Col0 の値が 100 より大きい場合に、行を更新します。

private static void updateRow(SyncClient client, String pkValue) {
    // プライマリキーを構築します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // テーブルの名前を指定します。
    RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);

    // 指定された行が存在し、Col0 列の値が 100 より大きいことを期待する行の存在条件と列ベースの条件を指定します。
    Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
    condition.setColumnCondition(new SingleColumnValueCondition("Col0",
            SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
    rowUpdateChange.setCondition(condition);

    // 列を更新します。
    for (int i = 0; i < 10; i++) {
        rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
    }

    // 列から特定のバージョンのデータを削除します。
    rowUpdateChange.deleteColumn("Col10", 1465373223000L);

    // 列を削除します。
    rowUpdateChange.deleteColumns("Col11");

    client.updateRow(new UpdateRowRequest(rowUpdateChange));
}

複数行を一度に書き込む

次の例では、2 つの PutRow 操作、1 つの UpdateRow 操作、および 1 つの DeleteRow 操作を含む BatchWriteRow リクエストを送信します。

private static void batchWriteRow(SyncClient client) {
    BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();

    // rowPutChange1 を構築します。
    PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    pk1Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk1"));
    // データテーブルの名前を指定します。
    RowPutChange rowPutChange1 = new RowPutChange("<TABLE_NAME>", pk1Builder.build());
    // 列を追加します。
    for (int i = 0; i < 10; i++) {
        rowPutChange1.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
    }
    // バッチ操作のコードに rowPutChange1 を追加します。
    batchWriteRowRequest.addRowChange(rowPutChange1);

    // rowPutChange2 を構築します。
    PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    pk2Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk2"));
    // データテーブルの名前を指定します。
    RowPutChange rowPutChange2 = new RowPutChange("<TABLE_NAME>", pk2Builder.build());
    // 列を追加します。
    for (int i = 0; i < 10; i++) {
        rowPutChange2.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
    }
    // バッチ操作のコードに rowPutChange2 を追加します。
    batchWriteRowRequest.addRowChange(rowPutChange2);

    // rowUpdateChange を構築します。
    PrimaryKeyBuilder pk3Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    pk3Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk3"));
    // データテーブルの名前を指定します。
    RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", pk3Builder.build());
    // 列を追加します。
    for (int i = 0; i < 10; i++) {
        rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
    }
    // 列を削除します。
    rowUpdateChange.deleteColumns("Col10");
    // バッチ操作のコードに rowUpdateChange を追加します。
    batchWriteRowRequest.addRowChange(rowUpdateChange);

    // rowDeleteChange を構築します。
    PrimaryKeyBuilder pk4Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    pk4Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk4"));
    // データテーブルの名前を指定します。
    RowDeleteChange rowDeleteChange = new RowDeleteChange("<TABLE_NAME>", pk4Builder.build());
    // バッチ操作のコードに rowDeleteChange を追加します。
    batchWriteRowRequest.addRowChange(rowDeleteChange);

    BatchWriteRowResponse response = client.batchWriteRow(batchWriteRowRequest);

    System.out.println("すべての操作が成功したかどうか:" + response.isAllSucceed());
    if (!response.isAllSucceed()) {
        for (BatchWriteRowResponse.RowResult rowResult : response.getFailedRows()) {
            System.out.println("失敗した行:" + batchWriteRowRequest.getRowChange(rowResult.getTableName(), rowResult.getIndex()).getPrimaryKey());
            System.out.println("失敗の原因:" + rowResult.getError());
        }
        /**
         * createRequestForRetry メソッドを使用して、失敗した行の操作を再試行するための別のリクエストを構築できます。ここでは再試行リクエストのみが構築されます。
         * 再試行方法として、Tablestore SDK のカスタム再試行ポリシーを使用することを推奨します。この機能により、バッチ操作後に失敗した行を再試行できます。再試行ポリシーを設定すると、操作を呼び出すための再試行コードを追加する必要がありません。
         */
        BatchWriteRowRequest retryRequest = batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
    }
}

課金

書き込み操作は、消費された CU 数に基づいて課金されます。従量課金の読み取りおよび書き込み CU と予約済みの読み取りおよび書き込み CU は別々に課金されます。インスタンスのタイプによって、どの CU タイプが消費されるかが決まります。

説明

インスタンスタイプと CU の詳細については、「インスタンス」および「読み取りと書き込みのスループット」をご参照ください。

書き込み CU の計算

操作計算式
PutRow切り上げ:(すべてのプライマリキー列のサイズ + 挿入された属性列のサイズ) / 4 KB
UpdateRow切り上げ:(すべてのプライマリキー列のサイズ + 更新された属性列のサイズ) / 4 KB。列の削除操作の場合、列名の長さが列サイズとしてカウントされます。
DeleteRow (BatchWriteRow 内)切り上げ:すべてのプライマリキー列のサイズ / 4 KB

読み取り CU の計算

読み取り CU は、condition パラメーターが IGNORE に設定されていない場合にのみ消費されます。

操作計算式条件が満たされない場合
PutRow切り上げ:すべてのプライマリキー列のサイズ / 4 KB操作は失敗します。1 書き込み CU と 1 読み取り CU を消費します。
UpdateRow切り上げ:すべてのプライマリキー列のサイズ / 4 KB操作は失敗します。1 書き込み CU と 1 読み取り CU を消費します。
DeleteRow (BatchWriteRow 内)切り上げ:すべてのプライマリキー列のサイズ / 4 KB操作は失敗します。1 書き込み CU と 1 読み取り CU を消費します。