Provided list of item keys contains duplicates (BatchGetItem)
TL;DR — 你的 BatchGetItem 中某張表的 Keys 陣列多次列出了同一個主索引鍵。DynamoDB 要求批次中的每個鍵都唯一,並會拒絕整個請求——它不會悄悄丟棄重複項。在傳送前對鍵列表去重。
這是什麼意思
ValidationException: Provided list of item keys contains duplicatesBatchGetItem 跨表讀取最多 100 個項目。在單張表的 Keys 列表內,每個條目必須是一個不同的主索引鍵(分割區索引鍵,或複合表的分割區索引鍵 + 排序索引鍵)。兩個解析到同一個鍵的條目會觸發這個 HTTP 400 ValidationException,整個呼叫失敗——不返回任何項目。它原樣不可重試。
為什麼會發生
- 同一個鍵出現兩次——常常是因為 ID 從多個來源收集而來且從未合併。
- 一個生成的鍵列表(例如把一個記錄列表對映為鍵),其源有重複行。
- 複合鍵混淆——兩個條目共享分割區索引鍵,但你忘了排序索引鍵有所不同;或者兩者確實完全相同。
- 大小寫/型別差異掩蓋了真實的重複——兩個鍵 marshal 成同一個值。
- 載入流水線(Glue、自定義 ETL)在沒有去重步驟的情況下批次處理鍵。
如何修正
- 在呼叫前去重。 用一個穩定的字串為每個條目做鍵,只保留一個:
const seen = new Set(); const keys = raw.filter((k) => { const id = `${k.pk.S}#${k.sk?.S ?? ''}`; if (seen.has(id)) return false; seen.add(id); return true; }); - 記住批次是一個集合,而非多重集——每個鍵你只需要讀一次;無論如何項目都只返回一次。
- 每個
BatchGetItem分塊到 100 個鍵,並處理響應中的UnprocessedKeys(限流,而非重複)。 - 用同樣的去重來守護你的 ETL/載入器,這樣問題就不會在上游復發。
在手工讀取批次時想看清你到底在傳送哪些鍵?DynoTable 桌面應用按鍵列出項目,因此一個工作集中意外的重複項很容易被發現。
DynoTable 中的路徑
在批次讀取生產中的鍵之前,請在 DynoTable 中發現重複項 — 使用 ⌘K 開啟表,篩選出你計劃獲取的 ID,並確認每個主索引鍵出現一次。項目列表並排顯示分割區索引鍵和排序索引鍵,因此複合鍵衝突很明顯。當你將讀取移至程式碼中時,首先使用 Query Builder 構建單鍵讀取原型,然後擴充套件到分塊 BatchGetItem。使用 ⌘P 切換設定檔案;在“設定”→“設定檔案”下使用“Test Connection”配置它們。參見連線 AWS和安裝。
來源
- BatchGetItem — Amazon DynamoDB API Reference(2026-07-13 驗證)
- Error handling with DynamoDB(2026-07-13 驗證)
相關錯誤
- Provided list of item keys contains duplicates (BatchWriteItem)——寫入路徑上的同一規則。
- ValidationException (overview)
- 程式碼示例:BatchGetItem in Node.js——一個可改用的正確分塊批次讀取。
- 學習:Batch operations
參考資料
- BatchGetItem — Amazon DynamoDB API Reference
- BatchWriteItem — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。