我正在尝试创建一个 SQL 查询以将行从一个表插入和更新到另一个表,这些表分别是 tmpTest
和 test
。 test
上的某些列被设置为 UNIQUE,因此当来自 tmpTest
的传入行之一在该列上具有相同的值时,它应该更新而不是插入。
我的查询:
INSERT INTO `test` ( name,lastName,age )
SELECT tmp.name,tmp.lastName,tmp.age FROM `tmpTest` tmp
ON DUPLICATE KEY UPDATE test.name = tmp.name AND test.lastName = tmp.lastName AND test.age = tmp.age ;
name
是 'UNIQUE' 列。
案例一:
`tmpTest`:
name lastName age
Dulcie Sheree 43
Elvin Wes 21
`test`:
id name lastName age
1 Dulcie Lilibeth 34
2 Sophia Dora 67
4 Jillian Britton 21
resulting `test`:
id name lastName age
1 0 Lilibeth 34
2 Sophia Dora 67
4 Jillian Britton 21
10 Elvin Wes 21
第一行没有更新并将名称字段更改为“0”。插入第二行。
案例二:
`tmpTest`:
name lastName age
Dulcie Sheree 43
Elvin Wes 21
`test`:
id name lastName age
1 Dulcie Lilibeth 34
2 Sophia Dora 67
4 Jillian Britton 21
10 Elvin Wes 21
我得到的错误:
Error Code: 1062. Duplicate entry '0' for key 'name_UNIQUE'
有什么建议吗? 谢谢!
最佳答案
这里的问题是您的 UPDATE 语句中的一系列 AND,这些应该是逗号 ','
我猜 MySQL 正在计算表达式
'Dulcie' = 'Dulcie' AND 'Sheree' = 'Lilibeth' AND 43 = 34
当这些值中的任何一个与其对不匹配时得到 0。
例如
mysql> SELECT 'Dulcie' = 'Dulcie' AND 'Sheree' = 'Lilibeth' AND 43 = 34;
+-----------------------------------------------------------+
| 'Dulcie' = 'Dulcie' AND 'Sheree' = 'Lilibeth' AND 43 = 34 |
+-----------------------------------------------------------+
| 0 |
+-----------------------------------------------------------+
1 row in set (0.00 sec)
我在这里“猜测”是因为我得到了
"Error Data truncation: Truncated incorrect DOUBLE value: 'Dulcie'"
当我尝试运行您的代码时,我无法复制您的结果。
当您再次运行它时,您将已经拥有 0 作为值,这将导致 test
上的 UNIQUE 约束失败。
用逗号替换 AND,你会得到你想要的结果
关于MySQL 错误代码 : 1062. 键 '0' 的重复条目 'nombre_UNIQUE',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49387767/