Attribute name is a reserved keyword
TL;DR — 你在 expression 中直接使用了一個屬於 DynamoDB 保留字的屬性名稱(約有 570 個 — status、name、size、type、data、year、count 及更多)。用 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: nameDynamoDB 保有一份保留字列表,它們不能字面出現在 expression 中(UpdateExpression、ConditionExpression、FilterExpression、KeyConditionExpression、ProjectionExpression)。當你的屬性恰好是其中之一時,解析器就拒絕該 expression。這是一個 ValidationException(HTTP 400),在你為名稱設別名前不可重試。訊息會指名確切的保留字。
為什麼會發生
- 常見的屬性名稱與保留字衝突 —
status、name、size、type、data、year、count、timestamp、source、region及數百個其他的都是保留的。 - 直接列出保留屬性名稱的
ProjectionExpression。 - 參照保留名稱的
FilterExpression/ConditionExpression(#status = :s有效;status = :s無效)。 - 以數字開頭,或含有空格、點或連字號的屬性名稱 — 這些也需要
ExpressionAttributeNames別名,並產生相關的驗證錯誤。
如何修正
- 用
ExpressionAttributeNames為名稱設別名。 將一個#placeholder對應到真實名稱,並在 expression 中使用該佔位符:await doc.send( new UpdateCommand({ TableName: 'Orders', Key: {pk: 'ORDER#1'}, UpdateExpression: 'SET #status = :s', ExpressionAttributeNames: {'#status': 'status'}, ExpressionAttributeValues: {':s': 'shipped'} }) ); - 佔位符必須以
#開頭後接字母數字/底線,且每個使用的#name都必須定義(每個定義的都要使用)。 - 防禦性地設別名 — 為 expression 中的每個屬性名稱設別名,就永遠不必知道哪些字是保留的。
- 為含字面點的名稱用單一佔位符設別名 — 一個字面上名為
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 中的每個屬性名稱設別名。
相關錯誤
- Invalid UpdateExpression 語法 — 格式不正確的 expression 結構。
- ValidationException (overview)
- 程式碼範例:UpdateItem in Node.js · in Python (boto3) — 以 #placeholder 設別名的保留字。
- 學習:Expression names & values · Update expressions
參考資料
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。