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
相关产品推荐
相关产品推荐

