ValidationException : Invalid UpdateExpression

TL;DR — Ton UpdateExpression est mal formé. Neuf fois sur dix, c'est un mot-clé réservé (comme status, name, size) utilisé directement — remplace-le par un #placeholder dans ExpressionAttributeNames. Le message indique le jeton exact.

Ce que ça signifie

Messages typiques :

ValidationException: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: status
ValidationException: Invalid UpdateExpression: Syntax error; token: "=", near: "SET status ="
ValidationException: Invalid UpdateExpression: An expression attribute value used in expression is not defined; attribute value: :s

DynamoDB analyse la chaîne de l'expression et rejette tout ce qui n'est pas une grammaire valide ou qui référence un placeholder non défini.

Pourquoi ça arrive

  • Mot-clé réservé utilisé tel quel. DynamoDB a des centaines de mots réservésstatus, name, size, count, data, year. Utilisés directement dans une expression, ils provoquent une erreur de syntaxe. Le vérificateur de mots réservés teste tes noms d'attributs contre la liste complète et émet la map d'alias.
  • Entrée ExpressionAttributeNames manquante pour un #name que tu as référencé.
  • Entrée ExpressionAttributeValues manquante pour une :value que tu as référencée.
  • Grammaire de verbe incorrecte — mélange incorrect de clauses (SET, REMOVE, ADD, DELETE ont chacune leur propre syntaxe), ou un = égaré.
  • Nom d'attribut avec des caractères spéciaux (points, tirets) utilisé sans placeholder.

Comment le corriger

  1. Aliase chaque nom d'attribut via ExpressionAttributeNames (#status) — cela contourne entièrement la liste des mots réservés, donc tout aliaser est une habitude sûre.
  2. Définis chaque :value que tu référence dans ExpressionAttributeValues.
  3. Utilise la bonne clause. SET pour écrire/écraser, REMOVE pour supprimer un attribut, ADD pour des incréments atomiques de nombre/ensemble, DELETE pour retirer d'un ensemble.

Exemple

import {DynamoDBClient} from '@aws-sdk/client-dynamodb';
import {DynamoDBDocumentClient, UpdateCommand} from '@aws-sdk/lib-dynamodb';

const doc = DynamoDBDocumentClient.from(new DynamoDBClient({}));

await doc.send(
  new UpdateCommand({
    TableName: 'Orders',
    Key: {pk: 'ORDER#1'},
    // #status aliases the reserved word "status"
    UpdateExpression: 'SET #status = :s, updatedAt = :t',
    ExpressionAttributeNames: {'#status': 'status'},
    ExpressionAttributeValues: {':s': 'SHIPPED', ':t': Date.now()}
  })
);

Vérifie d’abord dans DynoTable

Quand une mise à jour échoue dans ton app, reproduis-la dans DynoTable avant de toucher au code de production. Ouvre la table avec ⌘K, sélectionne l'élément, et sers-toi de l'éditeur de mise à jour en ligne — DynoTable aliase automatiquement les noms d'attributs réservés et affiche l'UpdateExpression générée avec ses deux maps d'attributs. Le staging (⌘S) te laisse prévisualiser la modification et attraper les erreurs de syntaxe avant validation.

Pour des corrections en lot, colle l'expression fautive dans l'Expression Builder et compare sa sortie à ce qu'envoie ton SDK. Le changement de profil (⌘P) garde tes essais sur le compte où l'erreur s'est produite ; sers-toi de Test Connection dans Settings → Profiles pour confirmer que le profil correspond. Vois Se connecter à AWS et Installation pour la configuration des profils. Recoupe les noms d'attributs dans le vérificateur de mots réservés quand l'erreur nomme un token précis comme status ou data. Aliaser chaque nom d'attribut — pas seulement les réservés — est une habitude sûre, qui élimine entièrement cette classe d'erreurs.

Sources

Erreurs liées

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.