Attribute name is a reserved keyword

TL;DR — Du hast einen Attributnamen verwendet, der eines der reservierten Wörter von DynamoDB ist (es gibt ~570 — status, name, size, type, data, year, count und viele mehr), direkt in einer Expression. Ersetze ihn durch einen ExpressionAttributeNames-Platzhalter — #status gemappt auf status — und der Request geht durch.

Was es bedeutet

ValidationException: 1 validation error detected: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: status
ValidationException: 1 validation error detected: Invalid KeyConditionExpression: Attribute name is a reserved keyword; reserved keyword: name

DynamoDB führt eine Liste reservierter Wörter, die nicht wörtlich in einer Expression erscheinen dürfen (UpdateExpression, ConditionExpression, FilterExpression, KeyConditionExpression, ProjectionExpression). Wenn dein Attribut zufällig eines davon ist, weist der Parser die Expression zurück. Es ist eine ValidationException (HTTP 400), nicht wiederholbar, bis du den Namen mit einem Alias versiehst. Die Meldung nennt das genaue reservierte Wort.

Warum es passiert

  • Ein gängiger Attributname kollidiert mit einem reservierten Wortstatus, name, size, type, data, year, count, timestamp, source, region und hunderte weitere sind reserviert.
  • Eine ProjectionExpression, die einen reservierten Attributnamen direkt auflistet.
  • Eine FilterExpression/ConditionExpression, die auf einen reservierten Namen verweist (#status = :s funktioniert; status = :s nicht).
  • Ein Attributname, der mit einer Zahl beginnt oder ein Leerzeichen, einen Punkt oder einen Bindestrich enthält — auch diese erfordern einen ExpressionAttributeNames-Alias und erzeugen einen verwandten Validierungsfehler.

So behebst du es

  1. Versieh den Namen mit ExpressionAttributeNames als Alias. Mappe einen #platzhalter auf den echten Namen und verwende den Platzhalter in der Expression:
    await doc.send(
      new UpdateCommand({
        TableName: 'Orders',
        Key: {pk: 'ORDER#1'},
        UpdateExpression: 'SET #status = :s',
        ExpressionAttributeNames: {'#status': 'status'},
        ExpressionAttributeValues: {':s': 'shipped'}
      })
    );
  2. Ein Platzhalter muss mit # beginnen, gefolgt von alphanumerischen Zeichen/Unterstrich, und jedes verwendete #name muss definiert sein (und jedes definierte verwendet werden).
  3. Setze Aliase defensiv — jeden Attributnamen in deinen Expressions mit einem Alias zu versehen, erspart dir, jemals wissen zu müssen, welche Wörter reserviert sind.
  4. Versieh Namen, die einen wörtlichen Punkt enthalten, mit einem einzigen Platzhalter — ein Attribut, das wörtlich Safety.Warning heißt, braucht einen Alias für den ganzen Namen ({'#sw': 'Safety.Warning'}), weil ein nicht aliassierter . als Dokumentpfad-Trenner gelesen wird. Für einen echten verschachtelten Pfad versieh stattdessen jedes Segment mit einem Alias (#pr.#5star).

FAQ

Wie behebe ich "Attribute name is a reserved keyword" in DynamoDB? Versieh das Attribut mit ExpressionAttributeNames als Alias. Mappe einen Platzhalter wie #status auf den echten Namen "status" und verwende #status in der Expression statt des wörtlichen Wortes. Der Platzhalter muss mit # beginnen und jeder, den du definierst, muss verwendet werden.

Welche DynamoDB-Attributnamen sind reserviert? Es gibt rund 570 reservierte Wörter, darunter alltägliche Namen wie status, name, size, type, data, year, count, timestamp und region. Statt die Liste auswendig zu lernen, versieh jeden Attributnamen in deinen Expressions mit ExpressionAttributeNames als Alias.

Verwandte Fehler

Referenzen

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

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.