快速将所有值从一个表复制到另一个表 - MySQL

时间:2015-03-14 07:37:09

标签: mysql join sql-update

假设我有两个BTREE索引表具有相同的行数但不必共享数据,我想将一列中的值从一个表复制到另一个表中。我看过other个问题' answers关于SELECTing涉及为两个表生成顺序ID,然后基于将这些ID匹配在一起执行一些JOIN操作。例如(来自第一个答案):

select result1.title1, title1.age1,result2.title2, title2.age2 from 
  (select @i:=@i+1 AS rowId, title1, age1 from tab1,(SELECT @i:=0) a) as result1 , 
  (select @j:=@j+1 AS rowId,title2, age2 from tab2,(SELECT @j:=0) a ) as result2 
where 
  result1.rowId = result2.rowId; #sic.

但是,我有两个问题:

  1. 我不知道如何以这种方式更新,因为我不知道我是否可以动态为目标表创建一个虚拟列(即相当于UPDATE (SELECT (@x:=@x+1), title1 FROM title1,(SELECT @x:=0) a ) INNER JOIN...的东西)。
  2. 我怀疑这是关于行数的O(n^2)时间。如果首先生成虚拟ID,则会出现这种情况,然后JOIN的每次运行都需要对一个或两个表进行线性搜索。是这样的吗?如果是这样,有没有更快的方法呢?

  3. 例如,请考虑以下两个表:

    CREATE TABLE t1 (
        id INT NOT NULL PRIMARY KEY,
        v INT
    );
    INSERT INTO t1 VALUES
        (1, 3),
        (3, 4),
        (25, 7);
    
    CREATE TABLE t2 LIKE t1;
    
    INSERT INTO t2 VALUES
        (6, 150),
        (9, 143),
        (14, 175);
    

    假设我想将v中的t2值替换为一个查询中t1中的t1值,以便mysql> SELECT * FROM t1; +----+------+ | id | v | +----+------+ | 1 | 150 | | 3 | 143 | | 25 | 175 | +----+------+ 3 rows in set (0.00 sec) 变为:

    {{1}}

    我该怎么做?

1 个答案:

答案 0 :(得分:0)

经过大量测试后,我认为我找到了一个非常可行的解决方案。如果源表上有顺序ID,则可以使用以下[无可置疑的有点不寻常]查询将这些值相对快速地复制到目标表(特别是如果源表为ENGINE=MEMORY):

UPDATE t1 CROSS JOIN (SELECT @x:=0) a 
    SET t1.v=(@x:=@x+1)+(SELECT v FROM t2 WHERE id=@x)-@x;

SELECT v...语句的开销非常重要,但它会大大减慢查询速度。