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 agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。