我正在尝试创建一个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'列。
案例1:
`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”更改了名称字段。插入第二行。
案例2:
`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'
有什么建议吗? 谢谢!
答案 0 :(得分:2)
这里的问题是你的UPDATE语句中的一系列AND,这些应该是逗号','
我猜MySQL正在评估表达式
'Dulcie' = 'Dulcie' AND 'Sheree' = 'Lilibeth' AND 43 = 34
当这些值中的任何一个与其配对不匹配时获得0。
e.g。
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,你将得到你在
之后的结果