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());
        }
    }
}

說明

  • ConditionalCheckFailedException 繼承自 DynamoDbException — 所以上面那個 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」。builder 的 String 多載會把同一個錯誤藏得更深(完整清單)。
  • 清空一張資料表不是一次 API 呼叫DeleteItem 剛好刪除一個索引鍵,而 SDK 裡沒有任何東西能刪很多個。清空資料表是先 Scan 取索引鍵、再做批次寫入,而且通常輸給 DeleteTableCreateTable

改用視覺化操作

如果你要守衛的屬性是保留字,條件就需要一個 # 別名。保留字檢查器會告訴你哪些屬性名稱落在 AWS 那份 573 字的清單上,並替中招的那些產生 expressionAttributeNames 對應表。

DynoTable 會先把刪除暫存到「待處理變更」面板,之後才送到資料表。Cmd+Backspace 暫存選取的列,Cmd+Shift+Backspace 一步刪除並提交,任何已暫存的東西都可以捨棄。下載 DynoTable

相關範例

參考資料

最後驗證於 2026-07-28,對照上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。