我有这个表,我想用当前使用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语法错误而失败?
答案 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在没有转义字符的情况下更具可读性。