DynamoDB: Table already exists

TL;DR — 该操作想_创建_它的目标表,而在这个账户 + 区域中名称已被占用。恢复(RestoreTableFromBackup / RestoreTableToPointInTime)抛出 TableAlreadyExistsExceptionCreateTableImportTable 把同样的情况报告为 ResourceInUseException。选一个新的目标名称——恢复和导入永远无法写入一张已有的表。

含义

TableAlreadyExistsException: A target table with the specified name already exists
ResourceInUseException: Table already exists: my-table

# what the engine actually returns, reproduced against DynamoDB Local:
ResourceInUseException: Cannot create preexisting table

恢复和导入操作总是创建一张全新的表——它们无法合并进或覆盖一张活动的表。如果目标名称在同一个账户和区域中解析到任何已有的表(无论其状态如何),请求都会一开始就失败。你看到哪个异常取决于 API:恢复家族有它自己的 TableAlreadyExistsException,而 CreateTableImportTable 呈现通用的 ResourceInUseException

为什么会发生

  • 把一个备份恢复到原来的名称——自然的本能("把我的表放回去")与仍然存在的表冲突。
  • 重新运行一次导入或 IaC 部署——一个重试的 ImportTable,或一个试图创建一张已在栈状态之外存在的表的 CloudFormation/Terraform/CDK 栈。
  • 一次创建后重试的竞速——第一个 CreateTable 成功了(或仍处于 CREATING),而重试发现名称被占用了。
  • 环境冲突——两个阶段/环境共享一个账户,且都想要那个无前缀的名称。

如何修复

  1. 恢复到一个新名称,然后切换——恢复为 my-table-restored,核实数据,把应用重新指向它(或者删除旧表并在它消失后以原来的名称再次恢复):

    aws dynamodb restore-table-from-backup \
      --target-table-name my-table-restored \
      --backup-arn arn:aws:dynamodb:...:table/my-table/backup/...
  2. 如果你打算替换这张表,就先删除已有的那张并等到删除完成——当表处于 DELETING 状态时名称仍被占用(此时尝试的恢复会以 TableInUseException 失败;CreateTable参见 ResourceInUseException)。

  3. 对于导入,选择一个未使用的目标名称——ImportTable 只创建新表。要把数据加载进一张已有的表,改用 BatchWriteItem/PutItem 写入。

  4. 对于 IaC 重试,把已有的表导入栈的状态(或重命名),而不是与创建搏斗。

  5. 检查实际存在什么——在同一区域/账户中 aws dynamodb list-tables 能确定名称是否真的空闲。

在切换前核实一张恢复出来的表是人们跳过的安全步骤——DynoTable 桌面应用把恢复的和原来的表并排放在一起,让你先对比模式并抽查项目。而如果你在估算恢复出来的表运行成本,DynamoDB 定价计算器覆盖两种容量模式。

在 DynoTable 中测量

在切换之前,打开 DynoTable 中的原始表和恢复表 — 切换到 ⌘K 并并排抽查项目。暂存 (⌘S) 允许你在不影响生产流量的情况下测试已恢复副本的写入。使用 pricing calculator 调整恢复表的大小。使用⌘P切换账户/地区; 在“设置”→“配置文件”上测试连接。参见连接 AWS安装

来源

相关错误

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

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