The provided expression refers to an attribute that does not exist in the item

TL;DR — 你的 UpdateExpression 讀取了一個不在項目上的屬性 — 一個算術運算元(SET score = score + :inc,而 score 從未設定)、從另一個屬性複製(SET a = b),或 list 運算元缺少的 list_append。以 if_not_exists 防護這個讀取,或在建立項目時種下該屬性。(寫入一條父層 map 缺少的巢狀路徑會拋出另一個 "document path invalid for update" 錯誤。)

這是什麼意思

ValidationException: The provided expression refers to an attribute
that does not exist in the item

這是一個 HTTP 400 ValidationException。請求解析正常,但當 DynamoDB 對項目求值它時,你的 expression 讀取的一個屬性 — +/- 的運算元、SET a = b 複製的來源,或 list_append 引數 — 不在那裡,因此運算元無法解析。這是用戶端問題且不可重試:相同的項目 + expression 會重現它。

為什麼會發生

  • 對未設定的屬性做算術SET score = score + :incscore 從未初始化時拋出;文件的遞增/遞減語法對一個_既有的_數值屬性運作。
  • 從缺少的屬性複製 — 當項目沒有 email 時的 SET backupEmail = email
  • 對缺少的 list 做 list_append — 當 tags 尚不存在時的 SET tags = list_append(tags, :more)
  • 巢狀路徑的佔位符對應錯誤 — 將整條帶點路徑對應到一個 ExpressionAttributeNames 項目("#p": "stats.viewCount"),而非只替換葉節點;DynamoDB 將字面上的 "stats.viewCount" 視為單一屬性名稱,它在 expression 讀取的那一刻就缺少了。
  • 讀取屬性名稱有拼字或大小寫錯誤 — DynamoDB 屬性名稱區分大小寫。

如何修正

  1. if_not_exists 防護讀取,讓第一次寫入即使屬性尚不存在也能運作:
    SET score = if_not_exists(score, :zero) + :inc
    SET tags = list_append(if_not_exists(tags, :emptyList), :more)
  2. 在建立項目時種下屬性 — 事先寫入 score: 0tags: [],讓後續讀取總能解析。
  3. 在巢狀路徑中只替換葉節點 — 在 expression 中保持點為字面:SET stats.#c = :v 搭配 {"#c": "viewCount"},而非將整條路徑放入一個名稱。
  4. 在假設路徑有效前,以 GetItem 驗證屬性存在/拼字 + 大小寫。
  5. 正在寫入一個父層 map 缺少的巢狀子層? 那是相關的錯誤 — 參見 the document path provided in the update expression is invalid for update 的兩步驟建立父層模式。

想在撰寫更新時把項目的真實形狀擺在眼前?DynoTable 桌面應用程式顯示每個屬性(包括巢狀 map 與 list),因此缺少的父層路徑一眼可見。

相關錯誤

參考資料

最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。

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

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

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