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