The provided expression refers to an attribute that does not exist in the item
En bref — Ton UpdateExpression lit un attribut qui n'est pas présent sur l'élément — un opérande arithmétique (SET score = score + :inc quand score n'a jamais été défini), une copie depuis un autre attribut (SET a = b), ou un list_append dont l'opérande liste est manquant. Protège la lecture avec if_not_exists, ou amorce l'attribut à la création de l'élément. (Écrire vers un chemin imbriqué dont le map parent est manquant lève l'erreur distincte "document path invalid for update".)
Ce que ça signifie
ValidationException: The provided expression refers to an attribute
that does not exist in the itemC'est un HTTP 400 ValidationException. La requête a été analysée sans problème, mais quand DynamoDB l'a évaluée face à l'élément, un attribut que ton expression lit — un opérande de +/-, la source d'une copie SET a = b, ou un argument de list_append — n'est pas là, donc l'opérande ne peut pas se résoudre. C'est côté client et non réessayable : le même élément + la même expression le reproduisent.
Pourquoi ça arrive
- Arithmétique sur un attribut non défini —
SET score = score + :inclève quandscoren'a jamais été initialisé ; la syntaxe d'incrément/décrément des docs opère sur un attribut numérique existant. - Copier depuis un attribut manquant —
SET backupEmail = emailquand l'élément n'a pas d'email. list_appendsur une liste manquante —SET tags = list_append(tags, :more)quandtagsn'existe pas encore.- Mauvais mapping de placeholder pour un chemin imbriqué — mapper tout le chemin pointé dans une seule entrée
ExpressionAttributeNames("#p": "stats.viewCount") au lieu de ne substituer que la feuille ; DynamoDB traite le littéral"stats.viewCount"comme un nom d'attribut unique, qui est manquant dès que l'expression le lit. - Une faute de frappe ou une mauvaise casse dans un nom d'attribut lu — les noms d'attributs DynamoDB sont sensibles à la casse.
Comment le corriger
- Protège la lecture avec
if_not_existspour que la première écriture fonctionne même quand l'attribut n'est pas encore là :SET score = if_not_exists(score, :zero) + :inc SET tags = list_append(if_not_exists(tags, :emptyList), :more) - Amorce l'attribut à la création de l'élément — écris
score: 0,tags: []d'emblée pour que les lectures ultérieures se résolvent toujours. - Ne substitue que la feuille dans un chemin imbriqué — garde les points littéraux dans l'expression :
SET stats.#c = :vavec{"#c": "viewCount"}, pas le chemin complet dans un seul nom. - Vérifie que l'attribut existe / l'orthographe + la casse avec un
GetItemavant de supposer que le chemin est valide. - Tu écris un enfant imbriqué dont le map parent est manquant ? C'est l'erreur sœur — voir the document path provided in the update expression is invalid for update pour le motif en deux étapes de création du parent.
Tu veux avoir la forme réelle de l'élément sous les yeux pendant que tu écris la mise à jour ? L'application de bureau DynoTable montre chaque attribut (y compris les maps et listes imbriqués) pour qu'un chemin parent manquant soit évident d'un coup d'œil.
Erreurs liées
- The document path provided in the update expression is invalid for update — écrire vers un chemin imbriqué dont le map/la liste parent est manquant ou du mauvais type.
- Invalid UpdateExpression syntax — l'expression elle-même est mal formée, attrapée avant cette vérification.
- Reserved keyword in attribute name — un nom entre en collision avec un mot réservé.
- ExpressionAttributeValues invalid
- Apprends : Update expressions · Expression names & values
Références
- Using update expressions in DynamoDB — Amazon DynamoDB Developer Guide
- TransactWriteItems — Amazon DynamoDB API Reference
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.