Provided list of item keys contains duplicates (BatchGetItem)

En bref — Le tableau Keys de ton BatchGetItem pour une table liste la même clé primaire plus d'une fois. DynamoDB exige que chaque clé d'un lot soit unique et rejette la requête entière — il ne supprime pas silencieusement le doublon. Dédoublonne la liste de clés avant de l'envoyer.

Ce que ça signifie

ValidationException: Provided list of item keys contains duplicates

BatchGetItem lit jusqu'à 100 éléments sur plusieurs tables. Dans la liste Keys d'une seule table, chaque entrée doit être une clé primaire distincte (clé de partition, ou partition + tri pour les tables composites). Deux entrées qui se résolvent en la même clé déclenchent ce HTTP 400 ValidationException, et tout l'appel échoue — aucun élément n'est renvoyé. Il n'est pas réessayable tel quel.

Pourquoi ça arrive

  • La même clé apparaît deux fois dans la liste — souvent parce que des IDs ont été collectés depuis plusieurs sources et jamais fusionnés.
  • Une liste de clés générée (p. ex. mapper une liste d'enregistrements vers des clés) où la source avait des lignes dupliquées.
  • Confusion de clé composite — deux entrées partagent la clé de partition mais tu as oublié que la clé de tri diffère ; ou les deux sont réellement identiques.
  • Différences de casse / de type masquant un vrai doublon — deux clés qui se marshalent vers la même valeur.
  • Des pipelines de chargement (Glue, ETL personnalisé) qui batchent les clés sans étape de dédoublonnage.

Comment le corriger

  1. Dédoublonne avant l'appel. Indexe chaque entrée par une chaîne stable et garde-en une :
    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. Souviens-toi qu'un lot est un ensemble, pas un sac — tu n'as jamais besoin que d'une lecture par clé ; l'élément revient une fois quoi qu'il arrive.
  3. Découpe en 100 clés par BatchGetItem et gère les UnprocessedKeys dans la réponse (throttling, pas doublons).
  4. Protège ton ETL/chargeur avec le même dédoublonnage pour que le problème ne puisse pas récidiver en amont.

Tu lis des lots à la main et veux voir exactement quelles clés tu envoies ? L'application de bureau DynoTable liste les éléments par clé, donc les doublons accidentels dans un jeu de travail sont faciles à repérer.

Chemin dans DynoTable

Avant de lire des clés en lot depuis la production, repère les doublons dans DynoTable — ouvre la table avec ⌘K, filtre sur les identifiants que tu comptes récupérer, et confirme que chaque clé primaire n'apparaît qu'une fois. La liste d'éléments affiche clés de partition et de tri côte à côte : les collisions de clés composites sautent aux yeux.

Quand tu passes la lecture dans le code, sers-toi du Query Builder pour prototyper d'abord des lectures sur une seule clé, puis monte en charge avec un BatchGetItem découpé. Change de profil avec ⌘P ; configure-les sous Settings → Profiles avec Test Connection. Vois Se connecter à AWS et Installation.

Sources

Erreurs liées

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.