Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
快速将所有值从一个表复制到另一个表中–MySQL_Mysql_Join_Sql Update - Fatal编程技术网

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

快速将所有值从一个表复制到另一个表中–MySQL,mysql,join,sql-update,Mysql,Join,Sql Update,假设我有两个具有BTREE索引的表,它们的行数相同,但不一定共享数据,我想将一列中的值从一个表复制到另一个表中。我已经看到了一些关于选择的问题,这些问题涉及为两个表生成顺序ID,然后在将这些ID匹配在一起的基础上执行一些连接操作。例如,第一个答案: select result1.title1, title1.age1,result2.title2, title2.age2 from (select @i:=@i+1 AS rowId, title1, age1 from tab1,(SEL

假设我有两个具有BTREE索引的表,它们的行数相同,但不一定共享数据,我想将一列中的值从一个表复制到另一个表中。我已经看到了一些关于选择的问题,这些问题涉及为两个表生成顺序ID,然后在将这些ID匹配在一起的基础上执行一些连接操作。例如,第一个答案:

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.
不过,我有两个顾虑:

我不知道如何以这种方式更新,因为我不知道是否可以动态地为目标表创建一个虚拟列,即相当于更新SELECT@x:=@x+1,title1 FROM title1,SELECT@x:=0内部联接。。。。 就行数而言,我怀疑这是在^2时间。如果首先生成虚拟ID,那么每次运行连接都需要对一个或两个表进行线性搜索,则会出现这种情况。是这样吗?如果是,有没有更快的方法?

例如,考虑以下两个表:

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);
假设我想在一个查询中将t2中的v值替换为t1中的v值,使t1变成:


我该怎么做呢?

经过大量测试,我认为我找到了一个非常可行的解决方案。如果源表上有顺序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;
从选择v。。。语句非常重要,但它会显著减慢查询速度。

请为每个表提供SHOW CREATE TABLE,并告诉我们哪列将一个表中的行与另一个表中的相应行相关联。
UPDATE t1 CROSS JOIN (SELECT @x:=0) a 
    SET t1.v=(@x:=@x+1)+(SELECT v FROM t2 WHERE id=@x)-@x;