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

Tablestore:データの削除

最終更新日:Mar 11, 2025

Tablestore は、単一のデータ行を削除するために呼び出すことができる DeleteRow 操作と、複数のデータ行を同時に削除するために呼び出すことができる BatchWriteRow 操作を提供します。

使用上の注意

削除したデータは復元できません。ご注意ください。

前提条件

  • OTSClient インスタンスが初期化されていること。詳細については、「クライアントの初期化」をご参照ください。

  • データテーブルが作成され、データがデータテーブルに書き込まれていること。

単一のデータ行を削除する

DeleteRow 操作を呼び出して、単一のデータ行を削除できます。削除する行が存在しない場合、データテーブルは変更されません。

パラメーター

パラメーター

説明

tableName

データテーブルの名前。

primaryKey

行のプライマリキー。このパラメーターの値は、各プライマリキー列の名前、タイプ、および値で構成されます。

重要

指定するプライマリキー列の数とタイプは、テーブル内のプライマリキー列の実際の数とタイプと同じである必要があります。

condition

操作を実行するために満たす必要がある条件。行存在条件、または列値に基づく条件を構成できます。詳細については、「条件付き更新の実行」をご参照ください。

データ行を削除する

次のサンプルコードは、テーブルからデータ行を削除する方法の例を示しています。

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

    client.deleteRow(new DeleteRowRequest(rowDeleteChange));
}                    

条件を指定してデータ行を削除する

次のサンプルコードは、行が存在し、行の Col0 列の値が 100 より大きい場合に、データテーブルからデータ行を削除する方法の例を示しています。

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

    // DeleteRow 操作の条件を指定します。この例では、行が存在し、Col0 列の値が 100 より大きい場合にのみ、行が削除されます。
    Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
    condition.setColumnCondition(new SingleColumnValueCondition("Col0",
            SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
    rowDeleteChange.setCondition(condition);

    client.deleteRow(new DeleteRowRequest(rowDeleteChange));
}                   

複数のデータ行を同時に削除する

  1. データを削除する前に、ビジネス要件に基づいて適切なメソッドを選択し、削除するデータのプライマリキー情報をクエリします。

    • プライマリキー値が特定の範囲内にあるデータを削除するには、GetRange 操作を呼び出してデータをクエリし、データのプライマリキー情報を取得します。詳細については、「プライマリキー値が特定の範囲内にあるデータを読み取る」をご参照ください。

    • 検索インデックスが作成されたデータテーブルから特定の条件を満たすデータを削除するには、検索インデックスを使用してデータをクエリし、データのプライマリキー情報を取得します。詳細については、「基本的なクエリ」をご参照ください。

    • データテーブルからすべてのデータを削除するには、データテーブルを削除し、同じ構成を持つデータテーブルを作成することをお勧めします。

      また、GetRange 操作を呼び出し、開始プライマリキーを INF_MIN に、終了プライマリキーを INF_MAX に設定して、テーブル内のすべてのデータをスキャンすることもできます。このようにして、テーブル内のすべてのデータのプライマリキー情報を取得できます。ただし、これには大量の計算リソースが消費されます。ご注意ください。

  2. 行のプライマリキー情報に基づいて、BatchWriteRow 操作を呼び出して、複数のデータ行を同時に削除します。詳細については、「データの書き込み」をご参照ください。

    次のサンプルコードは、pk プライマリキー列の値が pk であるデータ行をデータテーブルから削除し、pk1 プライマリキー列の値が pk1 で、pk2 プライマリキー列の値が pk2 であるデータ行を別のデータテーブルから同時に削除する方法の例を示しています。

    private static void batchWriteRow(SyncClient client) {    
        BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
    
        // rowDeleteChange1 を構築します。
        PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        pk1Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk"));
        // データテーブルの名前を指定します。
        RowDeleteChange rowDeleteChange1 = new RowDeleteChange("<TABLE_NAME1>", pk1Builder.build());
        // rowDeleteChange1 をバッチ操作のコードに追加します。
        batchWriteRowRequest.addRowChange(rowDeleteChange1);
    
        // rowDeleteChange2 を構築します。
        PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        pk2Builder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pk1"));
        pk2Builder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromString("pk2"));
        // データテーブルの名前を指定します。
        RowDeleteChange rowDeleteChange2 = new RowDeleteChange("<TABLE_NAME2>", pk2Builder.build());
        // rowDeleteChange2 をバッチ操作のコードに追加します。
        batchWriteRowRequest.addRowChange(rowDeleteChange2);
    
        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());
        }
    }

関連情報

Time to live(TTL)は、データの保存期間を指定します。データテーブルに TTL を構成して、期限切れのデータを自動的に削除できます。詳細については、「データバージョンと TTL」をご参照ください。