Value provided in ExpressionAttributeNames unused in expressions

TL;DR — Tu as déclaré un placeholder de nom dans ExpressionAttributeNames (par ex. #status) qu'aucune expression ne référence. DynamoDB exige que chaque alias déclaré soit utilisé dans une KeyConditionExpression, une FilterExpression, une UpdateExpression, une ConditionExpression ou une ProjectionExpression. Supprime l'alias inutilisé — ou corrige l'expression qui était censée le référencer.

Ce que ça signifie

ValidationException: 1 validation error detected: Value provided in ExpressionAttributeNames unused in
expressions: keys: {#status}

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: 1 validation error detected: Value provided in ExpressionAttributeNames unused in expressions: keys: {#status}

ExpressionAttributeNames est une map de substitution pour les alias de noms d'attributs (nécessaire pour les mots réservés ou les noms avec caractères spéciaux). DynamoDB applique un contrat strict à double sens : chaque alias que tu utilises dans une expression doit être déclaré, et chaque alias que tu déclares doit être utilisé. Une entrée résiduelle, non référencée, déclenche cette ValidationException HTTP 400. Elle est côté client et non réessayable tant que la map ne correspond pas aux expressions.

Pourquoi ça arrive

  • Un alias périmé laissé après l'édition d'une expression — tu as retiré #status = :s de l'expression mais oublié de supprimer #status de la map des noms.
  • Une map générée qui sur-déclare — une couche de mappage a émis des alias pour chaque attribut, même ceux que l'expression finale ne touche pas.
  • L'alias est dans la map des valeurs, pas des noms — tu voulais dire :status (une valeur) mais tu as déclaré #status (un nom).
  • Une faute de frappe — l'expression utilise #stat alors que la map déclare #status, donc #status est techniquement inutilisé.

Comment le corriger

  1. Supprime l'alias inutilisé que le message nomme dans ExpressionAttributeNames.
  2. Garde la map synchronisée avec les expressions — déclare un #name uniquement quand une expression le référence réellement.
  3. Vérifie une confusion nom-vs-valeur — les alias # vivent dans ExpressionAttributeNames, les placeholders : dans ExpressionAttributeValues.
  4. Régénère la requête pour que les noms, les valeurs et le texte de l'expression soient construits ensemble plutôt qu'assemblés à la main.

Inspecte dans DynoTable

DynoTable aliase les noms d'attributs réservés dans les éditeurs de mise à jour et de filtre — chaque #placeholder de la sortie est référencé dans l'expression. Ouvre une table avec ⌘K, modifie un élément, et copie la map ExpressionAttributeNames générée.

Recoupe les requêtes SDK en échec dans le vérificateur de mots réservés — il imprime la map d'alias pour les noms qui ont besoin d'un préfixe #. Change de profil avec ⌘P ; vois Se connecter à AWS et Installation.

Sources

Reproduire l'erreur

Une entrée d'ExpressionAttributeNames qu'aucune expression ne référence :

await client.send(
  new UpdateItemCommand({
    TableName: 'orders',
    Key: {pk: {S: 'ORDER#1'}, sk: {S: 'META'}},
    UpdateExpression: 'SET stat = :v', // note: 'stat', not '#unused'
    ExpressionAttributeNames: {'#unused': 'status'},
    ExpressionAttributeValues: {':v': {S: 'shipped'}}
  })
);

Sortie réelle :

ValidationException: 1 validation error detected: Value provided in ExpressionAttributeNames unused in expressions: keys: {#unused}
HTTP 400

Le message nomme la clé fautive, ce qui en fait l'une des rares erreurs de validation DynamoDB sur lesquelles tu peux agir sans rien lire d'autre. Elle apparaît généralement après une modification qui a retiré un placeholder de l'expression mais a laissé sa déclaration derrière elle.

Erreurs liées

Références

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

Reproduit le 2026-07-26 sur DynamoDB Local 2.x avec l'AWS SDK for JavaScript v3.1095.0 — la sortie ci-dessus est reproduite telle quelle.

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.