插入重复更新Mysql错误

use*_*543 1 mysql sql

我正在尝试使用以下内容插入Mysql中的重复键更新:

INSERT INTO `generic_client_data` (id, keyword, client_id, desc_id) 
VALUES (NULL, qqqq, 115, 0) ON DUPLICATE KEY 
UPDATE keyword=VALUES(qqqq), client_id=VALUES(115), desc_id=VALUES(0)
Run Code Online (Sandbox Code Playgroud)

但它给了我这个错误:

#1064 - You have an error in your SQL syntax; check the manual that 
        corresponds to your MySQL server version for the right syntax 
        to use near '115), desc_id=VALUES(0)' at line 1
Run Code Online (Sandbox Code Playgroud)

有原因吗?

Nat*_*C-K 6

查询的UPDATE部分中的VALUES"function"引用您在INSERT部分中使用的列名.你想要的是这个:

INSERT INTO `generic_client_data` (id, keyword, client_id, desc_id) 
VALUES (NULL, 'qqqq', 115, 0) ON DUPLICATE KEY 
UPDATE keyword=VALUES(keyword), client_id=VALUES(client_id), desc_id=VALUES(desc_id);
Run Code Online (Sandbox Code Playgroud)

这样,您可以返回您想要插入的任何值; 它们可能是计算值,也可能来自SELECT查询.当您进入更复杂的查询时,我认为您会发现这比您尝试的更方便.

大多数情况下,当您使用ON DUPLICATE KEY UPDATE时,您没有理由做任何其他事情

UPDATE x=VALUES(x), y=VALUES(y), z=VALUES(z)
Run Code Online (Sandbox Code Playgroud)

对于您想要插入的任何列.

如果您真的只想插入为各列指定的值,则省略VALUES(); 你可以这样做:

INSERT INTO `generic_client_data` (id, keyword, client_id, desc_id) 
VALUES (NULL, 'qqqq', 115, 0) ON DUPLICATE KEY 
UPDATE keyword='qqqq', client_id=115, desc_id=0
Run Code Online (Sandbox Code Playgroud)

但是,这需要您输入两次所有值,每次更改语句时都必须确保所有值都匹配.

阅读手册不会有什么坏处,因为错误消息表明:http: //dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html