ON DUPLICATE KEY UPDATE上的SQL语法错误

时间:2014-08-25 13:25:52

标签: php mysql sql database web-deployment

我有这个表,我想用当前使用ON DUPLICATE KEY UPDATE的一个语句更新/插入:

index (INT) user(INT) entryId(INT) tags(text)
1              1          111      ||bla||
2              1          111      ||bla||
3              1          111      ||bla||
  

INSERT INTO过滤器(index,user,entryId,tags)VALUES   (1,1, '100003817186741', “|| TEST1 |||| || TEST2”),   (3,1,'100003021196089',“|| test1 |||| test2 ||”)ON DUPLICATE KEY UPDATE   用户= VALUES(用户),ENTRYID = VALUES(ENTRYID),标记= VALUES(标签)

为什么这会因SQL语法错误而失败?

3 个答案:

答案 0 :(得分:1)

index是SQL保留字,必须重写查询

INSERT INTO filters (`index`,`user`,entryId,tags) VALUES (1,1,'100003817186741',"||test1||||test2||"), (3,1,'100003021196089',"||test1||||test2||") ON DUPLICATE KEY UPDATE `user`=VALUES(`user`),entryId=VALUES(entryId),tags=VALUES(tags)

答案 1 :(得分:1)

失败,因为index是MySQL保留字。

http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

将其包裹在反引号中或为其选择另一个单词

INSERT INTO filters (index,user,entryId,tags)
                     ^    ^

DO

INSERT INTO filters (`index`,user,entryId,tags)

答案 2 :(得分:0)

你的语法看起来很奇怪,有四个竖条,混合单引号和双引号。

INSERT INTO filters(index, user, entryId, tags)
    VALUES (1, 1, '100003817186741', "||test1||||test2|| "),  
           (3, 1, '100003021196089', "||test1||||test2|| ")
    ON DUPLICATE KEY UPDATE user=VALUES(user),entryId=VALUES(entryId),tags=VALUES(tags);

我会写得更像:

INSERT INTO filters(`index`, `user`, entryId, tags)
    SELECT 1, 1, '100003817186741', CONCAT('||', test1, '||', test2) UNION ALL
    SELECT 3, 1, '100003021196089', CONCAT('||', test1, '||', test2)
    ON DUPLICATE KEY UPDATE `user` = VALUES(`user`),
                            entryId = VALUES(entryId),
                            tags = VALUES(tags);

即使用显式concat()函数。使用select代替values只是个人偏好 - select . . . union all执行values所做的一切以及更多。

另外,请避免使用index等保留字作为列名或表名。这些是保留字,SQL在没有转义字符的情况下更具可读性。