Attribute name is a reserved keyword

TL;DR — 你在 expression 中直接使用了一個屬於 DynamoDB 保留字的屬性名稱(約有 570 個 — statusnamesizetypedatayearcount 及更多)。用 ExpressionAttributeNames 佔位符替換它 — #status 對應到 status — 請求就會通過。

這是什麼意思

ValidationException: 1 validation error detected: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: status
ValidationException: 1 validation error detected: Invalid KeyConditionExpression: Attribute name is a reserved keyword; reserved keyword: name

DynamoDB 保有一份保留字列表,它們不能字面出現在 expression 中(UpdateExpressionConditionExpressionFilterExpressionKeyConditionExpressionProjectionExpression)。當你的屬性恰好是其中之一時,解析器就拒絕該 expression。這是一個 ValidationException(HTTP 400),在你為名稱設別名前不可重試。訊息會指名確切的保留字。

為什麼會發生

  • 常見的屬性名稱與保留字衝突statusnamesizetypedatayearcounttimestampsourceregion 及數百個其他的都是保留的。
  • 直接列出保留屬性名稱的 ProjectionExpression
  • 參照保留名稱的 FilterExpression/ConditionExpression#status = :s 有效;status = :s 無效)。
  • 以數字開頭,或含有空格、點或連字號的屬性名稱 — 這些也需要 ExpressionAttributeNames 別名,並產生相關的驗證錯誤。

如何修正

  1. ExpressionAttributeNames 為名稱設別名。 將一個 #placeholder 對應到真實名稱,並在 expression 中使用該佔位符:
    await doc.send(
      new UpdateCommand({
        TableName: 'Orders',
        Key: {pk: 'ORDER#1'},
        UpdateExpression: 'SET #status = :s',
        ExpressionAttributeNames: {'#status': 'status'},
        ExpressionAttributeValues: {':s': 'shipped'}
      })
    );
  2. 佔位符必須以 # 開頭後接字母數字/底線,且每個使用的 #name 都必須定義(每個定義的都要使用)。
  3. 防禦性地設別名 — 為 expression 中的每個屬性名稱設別名,就永遠不必知道哪些字是保留的。
  4. 為含字面點的名稱用單一佔位符設別名 — 一個字面上名為 Safety.Warning 的屬性需要為整個名稱設一個別名({'#sw': 'Safety.Warning'}),因為未設別名的 . 會被讀為 document-path 分隔符。對真正的巢狀路徑,改為為每個片段設別名(#pr.#5star)。

常見問題

我要如何修正 DynamoDB 中的 "Attribute name is a reserved keyword"? 用 ExpressionAttributeNames 為屬性設別名。將像 #status 這樣的佔位符對應到真實名稱 "status",並在 expression 中使用 #status 而非字面字詞。佔位符必須以 # 開頭,且你定義的每一個都必須被使用。

哪些 DynamoDB 屬性名稱是保留的? 約有 570 個保留字,包括像 status、name、size、type、data、year、count、timestamp 與 region 這樣的日常名稱。與其背下列表,不如用 ExpressionAttributeNames 為 expression 中的每個屬性名稱設別名。

相關錯誤

參考資料

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

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

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

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