【发布时间】:2015-03-14 07:37:08
【问题描述】:
假设我有两个具有 BTREE 索引的表,它们具有相同的行数但不一定共享数据,并且我想将一个表中的一个列中的值复制到另一个表中。我已经看到other 问题的answers 涉及为两个表生成顺序 ID 的 SELECTing,然后基于将这些 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.
但是,我有两个担忧:
- 我不确定如何以这种方式更新,因为我不知道是否可以即时为目标表创建一个虚拟列(即相当于
UPDATE (SELECT (@x:=@x+1), title1 FROM title1,(SELECT @x:=0) a ) INNER JOIN...的东西)。 - 我怀疑这是在
O(n^2)时间关于行数。如果首先生成虚拟 ID,然后每次运行JOIN都需要对一个或两个表进行线性搜索,就会出现这种情况。是这样吗?如果是这样,有没有更快的方法来做到这一点?
例如,考虑以下两个表:
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 中的值,以便t1 变为:
mysql> SELECT * FROM t1;
+----+------+
| id | v |
+----+------+
| 1 | 150 |
| 3 | 143 |
| 25 | 175 |
+----+------+
3 rows in set (0.00 sec)
我该怎么做?
【问题讨论】:
-
请为每个表提供
SHOW CREATE TABLE,并告诉我们哪一列将一个表中的一行与另一个表中的对应行相关联。
标签: mysql join sql-update