Java(AWS SDK v2)での DynamoDB DeleteItem

AWS SDK for Java 2.x での削除は、完全なプライマリキーを携えた DeleteItemRequest であり、ReturnValue.ALL_OLD がそこに本当に何かがあったのかを教えてくれます。

下のコードに conditionExpression を足すと、コンパイルは通るのにバグを抱えることになります。スニペットの下の最初の箇条書きが、そのバグです。

コード

import java.util.HashMap;
import java.util.Map;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DeleteItemRequest;
import software.amazon.awssdk.services.dynamodb.model.DeleteItemResponse;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.ReturnValue;

public class DeleteItemExample {
    public static void main(String[] args) {
        try (DynamoDbClient ddb = DynamoDbClient.builder()
                .region(Region.US_EAST_1)
                .build()) {

            Map<String, AttributeValue> key = new HashMap<>();
            key.put("Artist", AttributeValue.builder().s("Arturo Sandoval").build());
            key.put("SongTitle", AttributeValue.builder().s("Cubano Chant").build());

            DeleteItemRequest request = DeleteItemRequest.builder()
                    .tableName("Music")
                    .key(key)
                    .returnValues(ReturnValue.ALL_OLD)
                    .build();

            DeleteItemResponse response = ddb.deleteItem(request);
            if (response.attributes().isEmpty()) {
                System.out.println("No item with that key existed");
            } else {
                System.out.println("Deleted: " + response.attributes());
            }
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
        }
    }
}

解説

  • ConditionalCheckFailedExceptionDynamoDbException を継承しています — つまり上の catch ブロックは、失敗したガードを飲み込み、サービスが壊れたかのように表示します。リクエストが conditionExpression を持つようになったら、より狭い型を先に捕捉しましょう。仕事をした条件は、エラーではなく結果です。
  • 例外は、負けたアイテムを携えています — リクエストに returnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD) を付けると、e.item() が DynamoDB から見えていたままの行を返します。AWS はその値段も明記しています。"No read capacity units are consumed."
  • attributes()null を返すことはありません — 何にも一致しなかった削除は空のマップを返すので、判定は isEmpty() です。「サービスが何も返さなかった」と「サービスが空のマップを返した」を分けるのが hasAttributes() です。
  • ReturnValue の enum は UpdateItem と共有されていますreturnValues(ReturnValue.ALL_NEW) はここでもコンパイルが通り、ValidationException となって返ってきます。"DeleteItem does not recognize any values other than NONE or ALL_OLD" だからです。ビルダーの String オーバーロードは、同じ誤りを覆い隠します(全体像)。
  • テーブルを空にするための API 呼び出しはありませんDeleteItem はちょうど 1 つのキーを削除し、SDK には複数を削除するものがありません。テーブルの中身を空にするのはキーの Scan とそれに続くバッチ書き込みであり、たいてい DeleteTableCreateTable の組み合わせに負けます。

ビジュアルに行う

ガードに使う属性が予約語なら、その条件には # の別名が必要です。予約語チェッカーは、自分の属性名のどれが AWS の 573 語のリストに載っているかを教え、該当するものについて expressionAttributeNames のマップを生成します。

DynoTable は、削除がテーブルに届く前に「保留中の変更」パネルへステージします。Cmd+Backspace で選択した行をステージし、Cmd+Shift+Backspace で削除とコミットを一度に行い、ステージしたものはすべて破棄できます。DynoTable をダウンロードしてください。

関連する例

参考資料

最終検証日 2026-07-28、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。