INSERT + SELECT FROM + JOIN + ON DUPLICATE KEY MySQL

时间:2015-03-13 22:05:17

标签: mysql select join insert on-duplicate-key

出于某种原因,INSERT INTO ... SELECT FROM ... CROSS JOIN ... ON DUPLICATE KEY UPDATE的组合似乎不起作用。例如,我有一个包含一些数字信息CREATE TABLE t ( v INT );的表,我想将它复制到现有的MEMORYCREATE 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。

带表格结构的

SQL Fiddle

2 个答案:

答案 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;