出于某种原因,INSERT INTO ... SELECT FROM ... CROSS JOIN ... ON DUPLICATE KEY UPDATE
的组合似乎不起作用。例如,我有一个包含一些数字信息CREATE TABLE t ( v INT );
的表,我想将它复制到现有的MEMORY
表CREATE TABLE m (id INT DEFAULT 1, v INT, KEY `id` (`id`) ) ENGINE=MEMORY;
中,序列ID从1开始。而不是删除所有内容和如果密钥存在,重新插入,我想我可以做以下事情:
INSERT INTO m
SELECT (@x:=@x+1), v FROM t
CROSS JOIN (SELECT @x:=1) a
ON DUPLICATE KEY UPDATE m.v=t.v;
但是我收到以下错误:
您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在  KEY UPDATE m.v = t.v'附近使用正确的语法。在第1行
然而,以下查询运行时没有错误(显然没有顺序值):
INSERT INTO m (v) SELECT v FROM t ON DUPLICATE KEY UPDATE m.v=t.v;
现在,我知道AUTO_INCREMENT
,但我更普遍地提出要求。我可以想一下这种查询结构有用的一些情况,那有什么不对?我正在跑5.6.20。
答案 0 :(得分:2)
我不确定出了什么问题,但我找到了解决办法:
INSERT INTO m
SELECT * FROM (SELECT (@x:=@x+1) id, v FROM t
CROSS JOIN (SELECT @x:=1) a ) b
ON DUPLICATE KEY UPDATE m.v=b.v;
答案 1 :(得分:-1)
有关INSERT ... ON DUPLICATE KEY UPDATE Syntax的MySQL文档的几条评论已经解决了这个问题。
或者,如果你更愿意保留你所拥有的而不是覆盖,你可以使用以下语法。
INSERT IGNORE INTO m (v)
SELECT v
FROM t;