An operand in the update expression has an incorrect data type

TL;DR — Die Aktion des Updates wird gegen das typgeprüft, was tatsächlich gespeichert ist (und gegen den gesendeten Wert), und eines davon passt nicht: ADD gegen ein Attribut, das keine Zahl oder kein Set ist, list_append gegen etwas, das keine Liste ist, oder ein Set-Operand, dessen Elementtyp nicht zum gespeicherten Set passt. Bringe den Operanden mit dem gespeicherten Typ in Übereinstimmung — oder korrigiere das Item, dessen Typ abgedriftet ist.

Was es bedeutet

ValidationException: An operand in the update expression has an incorrect data type

Update-Aktionen haben strenge Typregeln: ADD funktioniert nur auf Zahlen und Sets (SS/NS/BS), DELETE nur auf Sets, und list_append nimmt zwei Listen. DynamoDB wertet die Expression zur Schreibzeit gegen die aktuellen Attributtypen des Items aus — sodass derselbe Request bei einem Item gelingen und bei einem anderen scheitern kann, dessen Attribut einen anderen Typ hält. Ein naher Cousin wird früher, zur Expression-Parse-Zeit, zurückgewiesen, wenn der Typ des gesendeten Werts niemals zum Operator passen kann:

ValidationException: Invalid UpdateExpression: Incorrect operand type for
operator or function; operator: ADD, operand type: LIST

Warum es passiert

  • ADD counter :one, aber counter ist als String gespeichert — z. B. wurde das Item mit "5" (Typ S) statt 5 (Typ N) importiert.
  • ADD tags :t mit einem Listen-(L)-OperandenADD sammelt in Sets, nicht Listen. Listen werden mit SET + list_append angehängt.
  • list_append(mylist, :v), wo mylist eine Map, ein Set oder ein Skalar ist — beide Argumente müssen Listen sein (wickle ein einzelnes Element als Ein-Element-Liste).
  • Set-Elementtyp-KonfliktADD/DELETE mit einem String-Set-(SS)-Operanden gegen ein gespeichertes Number-Set (NS) oder umgekehrt.
  • Typdrift über Items hinweg — gemischte Writer (ein alter Import, ein anderer Dienst) haben dasselbe Attribut bei manchen Items als N und bei anderen als S belassen, sodass das Update nur manchmal scheitert.

So behebst du es

  1. Zähler: speichere den Wert als Zahl und sende einen Zahlen-Operanden:

    UpdateExpression: 'ADD #c :one',
    ExpressionAttributeValues: {':one': 1}   // {N: "1"} — not a string
  2. Listen: nutze SET mit list_append und wickle das neue Element in eine Liste:

    UpdateExpression: 'SET #l = list_append(if_not_exists(#l, :empty), :new)',
    ExpressionAttributeValues: {':new': ['item'], ':empty': []}
  3. Sets: halte ADD/DELETE-Operanden vom selben Set-Typ wie das gespeicherte Attribut (SS mit SS, NS mit NS).

  4. Korrigiere abgedriftete Items — finde die Items, deren Attribut den falschen Typ trägt, und schreibe sie einmal neu; das Symptom "dasselbe Update scheitert bei manchen Items" ist immer Daten, nicht Code.

Typdrift ist in den meisten Konsolen unsichtbar — die DynoTable-Desktop-App zeigt den tatsächlich gespeicherten Typ jedes Attributs neben seinem Wert, sodass ein "5"-als-String-Zähler sofort auffällt.

Verwandte Fehler

Referenzen

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

Mit DynamoDB ohne die Console arbeiten

DynoTable ist ein schneller Desktop-Client für DynamoDB — durchsuche Tabellen, führe SQL-artige Queries aus und bearbeite Items lokal.