Provided list of item keys contains duplicates (BatchGetItem)

TL;DR — 你的 BatchGetItem 中某張表的 Keys 陣列多次列出了同一個主索引鍵。DynamoDB 要求批次中的每個鍵都唯一,並會拒絕整個請求——它不會悄悄丟棄重複項。在傳送前對鍵列表去重。

這是什麼意思

ValidationException: Provided list of item keys contains duplicates

BatchGetItem 跨表讀取最多 100 個項目。在單張表的 Keys 列表內,每個條目必須是一個不同的主索引鍵(分割區索引鍵,或複合表的分割區索引鍵 + 排序索引鍵)。兩個解析到同一個鍵的條目會觸發這個 HTTP 400 ValidationException,整個呼叫失敗——不返回任何項目。它原樣不可重試

為什麼會發生

  • 同一個鍵出現兩次——常常是因為 ID 從多個來源收集而來且從未合併。
  • 一個生成的鍵列表(例如把一個記錄列表對映為鍵),其源有重複行。
  • 複合鍵混淆——兩個條目共享分割區索引鍵,但你忘了排序索引鍵有所不同;或者兩者確實完全相同。
  • 大小寫/型別差異掩蓋了真實的重複——兩個鍵 marshal 成同一個值。
  • 載入流水線(Glue、自定義 ETL)在沒有去重步驟的情況下批次處理鍵。

如何修正

  1. 在呼叫前去重。 用一個穩定的字串為每個條目做鍵,只保留一個:
    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;
    });
  2. 記住批次是一個集合,而非多重集——每個鍵你只需要讀一次;無論如何項目都只返回一次。
  3. 每個 BatchGetItem 分塊到 100 個鍵,並處理響應中的 UnprocessedKeys(限流,而非重複)。
  4. 用同樣的去重來守護你的 ETL/載入器,這樣問題就不會在上游復發。

在手工讀取批次時想看清你到底在傳送哪些鍵?DynoTable 桌面應用按鍵列出項目,因此一個工作集中意外的重複項很容易被發現。

DynoTable 中的路徑

在批次讀取生產中的鍵之前,請在 DynoTable 中發現重複項 — 使用 ⌘K 開啟表,篩選出你計劃獲取的 ID,並確認每個主索引鍵出現一次。項目列表並排顯示分割區索引鍵和排序索引鍵,因此複合鍵衝突很明顯。當你將讀取移至程式碼中時,首先使用 Query Builder 構建單鍵讀取原型,然後擴充套件到分塊 BatchGetItem。使用 ⌘P 切換設定檔案;在“設定”→“設定檔案”下使用“Test Connection”配置它們。參見連線 AWS安裝

來源

相關錯誤

參考資料

最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。

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

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

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