Local secondary indexes must be specified at table creation

TL;DR — 本地次要索引(LSI)只能在其表被建立的那一刻建立;之後無法新增、更改或移除。UpdateTable 沒有針對 LSI 的操作,因此任何向活動表新增 LSI 的嘗試都會驗證失敗。要得到一個新的 LSI,你必須建立一張新表(帶該 LSI)並遷移資料——或者使用一個全域次要索引(GSI),它_可以_線上新增。

這是什麼意思

ValidationException: One or more parameter values were invalid: Local secondary
indexes can only be created when a table is created

一個 LSI 與基礎表共享分割區索引鍵並新增一個備用排序索引鍵;DynamoDB 在寫入時把它與項目的分割槽放在一起。由於這種物理耦合,LSI 必須從表的第一次寫入起就存在——UpdateTable 支援新增/移除 GSI,但根本沒有 LSI 引數,因此你甚至無法傳送任何能夠事後補加它的請求。確切的訊息因路徑而異(SDK/CLI 呼叫可能在用戶端引數驗證失敗;IaC 工具會呈現它們自己的措辭),但伺服器端形式是一個 HTTP 400 ValidationException,且不可重試:這個操作在已有的表上根本不受支援。

為什麼會發生

  • 向活動表新增 LSI——呼叫 UpdateTable(或編輯 CloudFormation/Terraform 模板)在一張已存在的表上引入一個新的 LocalSecondaryIndexes 條目。
  • 更改現有的 LSI——其鍵模式或投影在建立時就固定了;編輯會被拒絕。
  • 重建而非更新的 IaC 差異——工具嘗試就地更新一個 DynamoDB 只允許在建立時進行的 LSI 變更。

如何修正

  1. 建立一張新表,預先定義好 LSI,然後遷移資料(掃描並寫入,或按需匯出/匯入)。
  2. 如果訪問模式允許,改用 GSI——GSI 可以線上新增到已有的表,且不要求相同的分割區索引鍵:
    aws dynamodb update-table --table-name <Table> \
      --attribute-definitions AttributeName=gsi_sk,AttributeType=S \
      --global-secondary-index-updates '[{"Create":{"IndexName":"gsi1", ...}}]'
  3. 在建模階段規劃 LSI——在表存在之前就決定好備用排序索引鍵,因為它們無法事後補加。

在 DynoTable 中檢查大小

在為 LSI 重建表之前,請驗證 DynoTable 中的訪問模式 — 使用 ⌘K 開啟表並測試 GSI 查詢是否滿足相同的需求。 Query Builder 生成新索引必須提供的 KeyConditionExpression。使用 pricing calculator 將 LSI 寫入放大與 GSI 替代方案進行比較。使用 ⌘P 切換設定檔案;參見連線 AWS安裝

來源

相關錯誤

參考資料

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

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

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

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