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 接受兩個列表。DynamoDB 在寫入時針對項目當前的屬性型別對運算式求值——因此同一個請求在一個項目上可能成功,而在另一個其屬性持有不同型別的項目上失敗。一個近親會更早地在運算式解析時被拒絕,當_傳送值的_型別永遠無法適配運算子時:

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

為什麼會發生

  • ADD counter :one,但 counter 儲存為字串——例如項目匯入時用了 "5"(型別 S)而不是 5(型別 N)。
  • ADD tags :t 配一個列表(L)運算元——ADD 收集進_集合_,而非列表。列表用 SET + list_append 追加。
  • list_append(mylist, :v),而 mylist 是一個 map、集合或標量——兩個引數都必須是列表(把單個元素包成一個單元素列表)。
  • 集合元素型別不匹配——ADD/DELETE 用一個字串集合(SS)運算元針對一個儲存的數字集合(NS),或反之。
  • 跨項目的型別漂移——混合的寫入者(一次舊的匯入、另一個服務)在某些項目上把同一個屬性留作 N、在另一些上留作 S,因此更新只是有時失敗。

如何修正

  1. 計數器: 把值儲存為數字併傳送一個數字運算元:

    UpdateExpression: 'ADD #c :one',
    ExpressionAttributeValues: {':one': 1}   // {N: "1"} — not a string
  2. 列表:SETlist_append,並把新元素包進一個列表:

    UpdateExpression: 'SET #l = list_append(if_not_exists(#l, :empty), :new)',
    ExpressionAttributeValues: {':new': ['item'], ':empty': []}
  3. 集合:ADD/DELETE 運算元保持與儲存屬性相同的集合型別(SSSSNSNS)。

  4. 修復漂移的項目——找到屬性攜帶錯誤型別的那些項目並一次性重寫它們;"同一個更新在某些項目上失敗"這一症狀總是資料問題,而非程式碼問題。

型別漂移在大多數主控台中是不可見的——DynoTable 的項目編輯器在每個屬性的值旁邊顯示它實際儲存的型別,因此一個作為字串的 "5" 計數器會立即顯現。

在 DynoTable 中開啟

DynoTable 的項目編輯器在其值旁邊顯示每個屬性的儲存型別(SNLSS、…) — 在執行 ADD 之前,代表數字計數器的字串 "5" 是顯而易見的。使用 ⌘K 開啟項目並檢查型別,然後使用暫存 (⌘S) 來測試更新。使用顯式型別標籤在 Expression Builder 中構建正確的運算式。使用 ⌘P 切換設定檔案;參見連線 AWS安裝

來源

相關錯誤

參考資料

最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。