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回來,因為「DeleteItemdoes not recognize any values other thanNONEorALL_OLD」。builder 的String多載會把同一個錯誤藏得更深(完整清單)。- 清空一張資料表不是一次 API 呼叫 —
DeleteItem剛好刪除一個索引鍵,而 SDK 裡沒有任何東西能刪很多個。清空資料表是先Scan取索引鍵、再做批次寫入,而且通常輸給DeleteTable加CreateTable。
改用視覺化操作
如果你要守衛的屬性是保留字,條件就需要一個 # 別名。保留字檢查器會告訴你哪些屬性名稱落在 AWS 那份 573 字的清單上,並替中招的那些產生 expressionAttributeNames 對應表。
DynoTable 會先把刪除暫存到「待處理變更」面板,之後才送到資料表。Cmd+Backspace 暫存選取的列,Cmd+Shift+Backspace 一步刪除並提交,任何已暫存的東西都可以捨棄。下載 DynoTable。
相關範例
- Go 中的 DynamoDB DeleteItem — 用 AWS SDK for Go v2 做同一種刪除。
- Java 中的 DynamoDB PutItem — 同一個索引鍵的寫入面。
- DynamoDB 條件運算式 — 用
attribute_exists與值檢查來守衛刪除。 - DynamoDB ConditionalCheckFailedException — 條件式刪除失敗時會丟出什麼,以及什麼時候這是預期內的。
參考資料
- DeleteItem — Amazon DynamoDB API Reference
- Use DeleteItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- DeleteItemRequest — AWS SDK for Java 2.x API Reference
- ConditionalCheckFailedException — AWS SDK for Java 2.x API Reference
- Condition expressions — Amazon DynamoDB Developer Guide
最後驗證於 2026-07-28,對照上方連結的 AWS 官方文件。