An operand in the update expression has an incorrect data type

TL;DR — 更新的操作会针对实际存储的内容(以及你发送的值)做类型检查,而其中之一不匹配:对一个不是数字或集合的属性做 ADD、对一个不是列表的东西做 list_append,或者一个元素类型与存储集合不匹配的集合操作数。让操作数与存储的类型匹配——或者修复那个类型漂移了的项目。

含义

ValidationException: An operand in the update expression has an incorrect data type

更新操作有严格的类型规则:ADD 只对数字集合SS/NS/BS)有效,DELETE 只对集合有效,而 list_append 接受两个列表。DynamoDB 在写入时针对项目当前的属性类型对表达式求值——因此同一个请求在一个项目上可能成功,而在另一个其属性持有不同类型的项目上失败。一个近亲会更早地在表达式解析时被拒绝,当_发送值的_类型永远无法适配运算符时:

ValidationException: Invalid UpdateExpression: Incorrect operand type for
operator or function; operator: ADD, operand type: LIST

为什么会发生

  • ADD counter :one,但 counter 存储为字符串——例如项目导入时用了 "5"(类型 S)而不是 5(类型 N)。
  • ADD tags :t 配一个列表(L)操作数——ADD 收集进_集合_,而非列表。列表用 SET + list_append 追加。
  • list_append(mylist, :v),而 mylist 是一个 map、集合或标量——两个参数都必须是列表(把单个元素包成一个单元素列表)。
  • 集合元素类型不匹配——ADD/DELETE 用一个字符串集合(SS)操作数针对一个存储的数字集合(NS),或反之。
  • 跨项目的类型漂移——混合的写入者(一次旧的导入、另一个服务)在某些项目上把同一个属性留作 N、在另一些上留作 S,因此更新只是有时失败。

如何修复

  1. 计数器: 把值存储为数字并发送一个数字操作数:

    UpdateExpression: 'ADD #c :one',
    ExpressionAttributeValues: {':one': 1}   // {N: "1"} — not a string
  2. 列表:SETlist_append,并把新元素包进一个列表:

    UpdateExpression: 'SET #l = list_append(if_not_exists(#l, :empty), :new)',
    ExpressionAttributeValues: {':new': ['item'], ':empty': []}
  3. 集合:ADD/DELETE 操作数保持与存储属性相同的集合类型(SSSSNSNS)。

  4. 修复漂移的项目——找到属性携带错误类型的那些项目并一次性重写它们;"同一个更新在某些项目上失败"这一症状总是数据问题,而非代码问题。

类型漂移在大多数控制台中是不可见的——DynoTable 的项目编辑器在每个属性的值旁边显示它实际存储的类型,因此一个作为字符串的 "5" 计数器会立即显现。

在 DynoTable 中打开

DynoTable 的项目编辑器在其值旁边显示每个属性的存储类型(SNLSS、…) — 在运行 ADD 之前,代表数字计数器的字符串 "5" 是显而易见的。使用 ⌘K 打开项目并检查类型,然后使用暂存 (⌘S) 来测试更新。使用显式类型标签在 Expression Builder 中构建正确的表达式。使用 ⌘P 切换配置文件;参见连接 AWS安装

来源

相关错误

参考资料

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

无需控制台即可使用 DynamoDB

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

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