【问题标题】:INSERT + SELECT FROM + JOIN + ON DUPLICATE KEY MySQLINSERT + SELECT FROM + JOIN + ON DUPLICATE KEY MySQL
【发布时间】:2015-05-16 13:21:49
【问题描述】:

由于某种原因,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 服务器版本相对应的手册,以在第 1 行的“KEY UPDATE m.v=t.v”附近使用正确的语法

然而,以下查询运行没有错误(显然没有顺序值):

INSERT INTO m (v) SELECT v FROM t ON DUPLICATE KEY UPDATE m.v=t.v;

现在,我知道AUTO_INCREMENT,但我问的更笼统。我可以想到这种查询结构有用的一些情况,那么有什么问题呢?我正在运行 5.6.20。

SQL Fiddle 带表结构。

【问题讨论】:

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


    【解决方案1】:

    我不确定出了什么问题,但我找到了解决方法:

    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;
    

    【讨论】:

      【解决方案2】:

      这在 MySQL 文档INSERT ... ON DUPLICATE KEY UPDATE Syntax 的几个 cmets 中得到了解决。

      或者,如果您宁愿保留已有的而不是覆盖,您可以使用以下语法。

      INSERT IGNORE INTO m (v)
      SELECT v
      FROM t;
      

      【讨论】:

      • 抱歉,我通读了文档中的 cmets,但找不到您引用的 cmets。除非我遗漏了一个关键点,即暗示这不起作用,否则 JOIN 行为没有得到解决。您能否将我引向您所指的 cmets?
      • @concat 啊...我错过了 JOIN 是什么让你。我必须使用 SQL Fiddle 才能弄清楚...
      猜你喜欢
      • 2022-08-02
      • 2011-01-29
      • 2011-08-09
      • 2010-12-15
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2023-02-06
      • 2012-02-26
      相关资源
      最近更新 更多