An operand in the update expression has an incorrect data type

TL;DR — 更新のアクションは、実際に格納されているもの(および送った値)に対して型チェックされ、そのいずれかが合いません: 数値でもセットでもない属性への ADD、リストでないものへの list_append、または格納されたセットと要素型が一致しないセットオペランドです。オペランドを格納された型に一致させる — または型がドリフトしたアイテムを修正してください。

意味

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

更新アクションには厳格な型ルールがあります: ADD数値セットSS/NS/BS)でのみ機能し、DELETE はセットでのみ、list_append は2つの リスト を取ります。DynamoDB は書き込み時にアイテムの現在の属性型に対して式を評価するため、同じリクエストが1つのアイテムで成功し、別の型を保持する別のアイテムで失敗することがあります。近いいとこは、送られた値の 型が演算子に決して合わないとき、より早い式の解析時に拒否されます:

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

発生する理由

  • ADD counter :one だが counter が文字列として格納されている — 例: アイテムが 5(型 N)ではなく "5"(型 S)でインポートされた。
  • リスト(L)オペランドでの ADD tags :tADD はリストではなく セット に集めます。リストは SET + list_append で追加されます。
  • mylist がマップ、セット、スカラーの場合の list_append(mylist, :v) — 両方の引数はリストである必要があります(単一の要素を1要素のリストとしてラップします)。
  • セット要素型の不一致 — 格納された数値セット(NS)に対する文字列セット(SS)オペランドでの ADD/DELETE、またはその逆。
  • アイテム間の型ドリフト — 混在するライター(古いインポート、別のサービス)が、同じ属性を一部のアイテムでは N、他では S として残したため、更新が時々しか失敗しない。

修正方法

  1. カウンター: 値を数値として格納し、数値オペランドを送ります:

    UpdateExpression: 'ADD #c :one',
    ExpressionAttributeValues: {':one': 1}   // {N: "1"} — not a string
  2. リスト: list_append とともに SET を使い、新しい要素をリストでラップします:

    UpdateExpression: 'SET #l = list_append(if_not_exists(#l, :empty), :new)',
    ExpressionAttributeValues: {':new': ['item'], ':empty': []}
  3. セット: ADD/DELETE オペランドを、格納された属性と同じセット型(SS には SSNS には NS)に保ちます。

  4. ドリフトしたアイテムを修正します — 属性が誤った型を運ぶアイテムを見つけ、一度書き直します。「同じ更新が一部のアイテムで失敗する」症状は常にコードではなくデータです。

型ドリフトはほとんどのコンソールで見えません。DynoTable デスクトップアプリ は各属性の実際に格納された型を値の横に表示するため、文字列としての "5" カウンターがすぐに目立ちます。

関連するエラー

References

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。