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

Tablestore:データの書き込み

最終更新日:Sep 29, 2026

Tablestore は、テーブルにデータを書き込むために、PutRow、UpdateRow、BatchWriteRow の 3 つのオペレーションを提供します。

説明

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

オペレーション

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

共通設定

データを書き込む前に、任意の書き込みオペレーションで次のオプションを設定できます:

  • データバージョン番号:デフォルトでは、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. [挿入] ダイアログボックスで、Primary Key Value 列に値を入力します。

  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 ignore

Tablestore SDKの使用

次のいずれかの SDK を使用してデータを書き込めます: Tablestore SDK for Java、Tablestore SDK for Go、Tablestore SDK for Python、Tablestore SDK for Node.js、Tablestore 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("pk", 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("pk", 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 オペレーションは失敗します。書き込み CU を 1、読み取り CU を 1 消費します。
UpdateRow 切り上げ:すべてのプライマリキー列のサイズ / 4 KB オペレーションは失敗します。書き込み CU を 1、読み取り CU を 1 消費します。
DeleteRow (BatchWriteRow内) 切り上げ:すべてのプライマリキー列のサイズ / 4 KB オペレーションは失敗します。書き込み CU を 1、読み取り CU を 1 消費します。