You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL错误1062排查:跨表插入更新时唯一键重复问题

解决MySQL INSERT ... ON DUPLICATE KEY UPDATE的1062重复键错误

咱们先拆解你遇到的问题,一步步搞定它:

1. 核心语法错误:UPDATE部分的分隔符用错了

你在ON DUPLICATE KEY UPDATE里用了AND来分隔字段赋值,这是完全错误的逻辑!MySQL里多字段更新应该用逗号分隔,而不是逻辑运算符AND。

当你写test.name = tmp.name AND test.lastName = tmp.lastName时,MySQL会把这个表达式当成布尔判断,结果只会是0或1,然后把这个结果赋值给test.name——这就导致name字段被错误设置为0,刚好触发了nombre_UNIQUE约束的重复键冲突(你的表中已经有行的nombre列值是0了)。

2. 潜在的列名不匹配问题

错误提示提到的是nombre_UNIQUE这个唯一键,但你的SQL里用的是name字段,这说明你的test表的唯一约束可能定义在nombre列上,而不是name列?如果是这样,得先确认列名是否一致,避免因拼写错误导致约束匹配失败。

正确的SQL写法

基础修正版(假设唯一约束在name或包含name的组合键上)

INSERT INTO `test` (name, lastName, age)
SELECT tmp.name, tmp.lastName, tmp.age
FROM `tmpTest` tmp
ON DUPLICATE KEY UPDATE
  name = tmp.name,
  lastName = tmp.lastName,
  age = tmp.age;

小提示:不需要加表前缀test.,ON DUPLICATE KEY UPDATE默认操作的是INSERT目标表的行。

如果唯一约束是在nombre列(对应错误提示的nombre_UNIQUE)

那你需要确保INSERT的列包含nombre,并且UPDATE时同步处理该列:

INSERT INTO `test` (nombre, lastName, age)
SELECT tmp.nombre, tmp.lastName, tmp.age
FROM `tmpTest` tmp
ON DUPLICATE KEY UPDATE
  nombre = tmp.nombre,
  lastName = tmp.lastName,
  age = tmp.age;

额外注意事项

  • 务必确认test表的UNIQUE约束真实存在,并且约束的列和你INSERT语句中的列完全匹配——只有当INSERT的行触发了UNIQUE约束的冲突时,才会执行UPDATE逻辑,否则还是会走INSERT流程。
  • 如果是组合唯一键(比如name+lastName),需要确保这两个列的组合值重复时才会触发UPDATE。

内容的提问来源于stack exchange,提问作者Javier Rodriguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:03:13