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 = :sde l'expression mais oublié de supprimer#statusde 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
#statalors que la map déclare#status, donc#statusest techniquement inutilisé.
Comment le corriger
- Supprime l'alias inutilisé que le message nomme dans
ExpressionAttributeNames. - Garde la map synchronisée avec les expressions — déclare un
#nameuniquement quand une expression le référence réellement. - Vérifie une confusion nom-vs-valeur — les alias
#vivent dansExpressionAttributeNames, les placeholders:dansExpressionAttributeValues. - 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
- Expression attribute names (aliases) in DynamoDB (vérifié le 2026-07-13)
- Reserved words in DynamoDB (vérifié le 2026-07-13)
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 400Le 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
- Value provided in ExpressionAttributeValues unused in expressions — la même règle pour les placeholders
:value. - The provided expression refers to an attribute that does not exist in the item — l'expression lit un attribut d'élément qui n'existe pas.
- Attribute name is a reserved keyword — pourquoi tu avais besoin d'un alias
#en premier lieu. - Apprends : Expression names & values
Références
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
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.