Value provided in ExpressionAttributeNames unused in expressions
TL;DR — Du hast in ExpressionAttributeNames einen Namensplatzhalter deklariert (z. B. #status), den keine Expression referenziert. DynamoDB verlangt, dass jeder deklarierte Alias in einer KeyConditionExpression, FilterExpression, UpdateExpression, ConditionExpression oder ProjectionExpression benutzt wird. Entferne den ungenutzten Alias — oder repariere die Expression, die ihn eigentlich referenzieren sollte.
Was es bedeutet
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 ist eine Substitutions-Map für Attributnamen-Aliase (nötig für reservierte Wörter oder Namen mit Sonderzeichen). DynamoDB erzwingt einen strikten Zwei-Wege-Vertrag: jeder Alias, den du in einer Expression verwendest, muss deklariert sein, und jeder Alias, den du deklarierst, muss verwendet werden. Ein übrig gebliebener, nicht referenzierter Eintrag löst diese HTTP-400-ValidationException aus. Er ist clientseitig und nicht wiederholbar, bis die Map zu den Expressions passt.
Warum es passiert
- Ein veralteter Alias, der nach dem Bearbeiten einer Expression zurückblieb — du hast
#status = :saus der Expression entfernt, aber vergessen,#statusaus der Namens-Map zu löschen. - Eine generierte Map, die überdeklariert — eine Mapping-Schicht gab Aliase für jedes Attribut aus, auch für solche, die die endgültige Expression nicht berührt.
- Der Alias steht in der Werte-Map, nicht in den Namen — du meintest
:status(einen Wert), hast aber#status(einen Namen) deklariert. - Ein Tippfehler-Mismatch — die Expression verwendet
#stat, während die Map#statusdeklariert, sodass#statustechnisch ungenutzt ist.
So behebst du es
- Lösch den ungenutzten Alias, den die Meldung nennt, aus
ExpressionAttributeNames. - Halte die Map im Gleichschritt mit den Expressions — deklarier ein
#namenur dann, wenn eine Expression es wirklich referenziert. - Prüfe auf eine Verwechslung von Namen und Werten —
#-Aliase leben inExpressionAttributeNames,:-Platzhalter inExpressionAttributeValues. - Erzeug den Request neu, damit Namen, Werte und Expression-Text zusammen entstehen statt von Hand zusammengesetzt zu werden.
In DynoTable prüfen
DynoTable aliases reserved attribute names in the update and filter editors — every #placeholder in the output is referenced in the expression. Öffne eine Tabelle mit ⌘K, edit an item, and copy the generated ExpressionAttributeNames map.
Cross-check failing SDK requests in the reserved words checker — it prints the alias map for names that need # prefixes. Wechsle Profile mit ⌘P; see Mit AWS verbinden and Installation.
Quellen
- Expression attribute names (aliases) in DynamoDB (verifiziert 2026-07-13)
- Reserved words in DynamoDB (verifiziert 2026-07-13)
So reproduzierst du es
Ein ExpressionAttributeNames-Eintrag, den keine Expression referenziert:
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'}}
})
);Echte Ausgabe:
ValidationException: 1 validation error detected: Value provided in ExpressionAttributeNames unused in expressions: keys: {#unused}
HTTP 400The message names the offending key, which makes this one of the few DynamoDB validation errors you can act on without reading anything else. It usually appears nachdem an edit removes a placeholder from the expression but leaves its declaration behind.
Verwandte Fehler
- Value provided in ExpressionAttributeValues unused in expressions — dieselbe Regel für
:value-Platzhalter. - The provided expression refers to an attribute that does not exist in the item — die Expression liest ein Item-Attribut, das nicht da ist.
- Attribute name is a reserved keyword — warum du überhaupt einen
#-Alias gebraucht hast. - Learn: Expression-Namen & -Werte
Referenzen
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
Zuletzt verifiziert am 2026-07-13 gegen die offizielle, oben verlinkte AWS-Dokumentation.
Am 2026-07-26 gegen DynamoDB Local 2.x mit dem AWS SDK for JavaScript v3.1095.0 reproduziert — die Ausgabe oben ist wortgetreu.