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 = :s aus der Expression entfernt, aber vergessen, #status aus 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 #status deklariert, sodass #status technisch ungenutzt ist.

So behebst du es

  1. Lösch den ungenutzten Alias, den die Meldung nennt, aus ExpressionAttributeNames.
  2. Halte die Map im Gleichschritt mit den Expressions — deklarier ein #name nur dann, wenn eine Expression es wirklich referenziert.
  3. Prüfe auf eine Verwechslung von Namen und Werten#-Aliase leben in ExpressionAttributeNames, :-Platzhalter in ExpressionAttributeValues.
  4. 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

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 400

The 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

Referenzen

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.

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.