Attribute name is a reserved keyword

In breve — Hai usato un nome di attributo che è una delle parole riservate di DynamoDB (ce ne sono ~570 — status, name, size, type, data, year, count, e molte altre) direttamente in un'espressione. Sostituiscilo con un placeholder ExpressionAttributeNames#status mappato a status — e la richiesta passa.

Cosa significa

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 mantiene una lista di parole riservate che non possono comparire letteralmente in un'espressione (UpdateExpression, ConditionExpression, FilterExpression, KeyConditionExpression, ProjectionExpression). Quando il tuo attributo è per caso una di esse, il parser rifiuta l'espressione. È una ValidationException (HTTP 400), non ripetibile finché non usi un alias per il nome. Il messaggio nomina l'esatta parola riservata.

Perché succede

  • Un nome di attributo comune collide con una parola riservatastatus, name, size, type, data, year, count, timestamp, source, region, e centinaia di altre sono riservate.
  • Una ProjectionExpression che elenca direttamente un nome di attributo riservato.
  • Una FilterExpression/ConditionExpression che fa riferimento a un nome riservato (#status = :s funziona; status = :s no).
  • Un nome di attributo che inizia con un numero, o contiene uno spazio, un punto o un trattino — anche questi richiedono un alias ExpressionAttributeNames, e producono un errore di validazione correlato.

Come risolverlo

  1. Usa un alias per il nome con ExpressionAttributeNames. Mappa un #placeholder al nome reale e usa il placeholder nell'espressione:
    await doc.send(
      new UpdateCommand({
        TableName: 'Orders',
        Key: {pk: 'ORDER#1'},
        UpdateExpression: 'SET #status = :s',
        ExpressionAttributeNames: {'#status': 'status'},
        ExpressionAttributeValues: {':s': 'shipped'}
      })
    );
  2. Un placeholder deve iniziare con # seguito da alfanumerici/underscore, e ogni #name usato deve essere definito (e ogni definito usato).
  3. Usa gli alias in modo difensivo — usare un alias per ogni nome di attributo nelle tue espressioni evita di dover mai sapere quali parole sono riservate.
  4. Usa un alias per i nomi che contengono un punto letterale con un singolo placeholder — un attributo chiamato letteralmente Safety.Warning necessita di un solo alias per l'intero nome ({'#sw': 'Safety.Warning'}), perché un . non aliasato viene letto come separatore di document path. Per un percorso genuinamente nidificato, usa invece un alias per ogni segmento (#pr.#5star).

FAQ

Come correggo "Attribute name is a reserved keyword" in DynamoDB? Usa un alias per l'attributo con ExpressionAttributeNames. Mappa un placeholder come #status al nome reale "status" e usa #status nell'espressione invece della parola letterale. Il placeholder deve iniziare con # e ognuno che definisci deve essere usato.

Quali nomi di attributo DynamoDB sono riservati? Ci sono circa 570 parole riservate, inclusi nomi di uso quotidiano come status, name, size, type, data, year, count, timestamp e region. Piuttosto che memorizzare la lista, usa un alias per ogni nome di attributo nelle tue espressioni con ExpressionAttributeNames.

Errori correlati

Riferimenti

Ultima verifica 2026-07-13 rispetto alla documentazione ufficiale AWS collegata sopra.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.