MySQL5.5:用不同ID复制相同用户信息的有效方法

qlzsbp2j  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(484)

在mysql 5.5中,假设我们有以下主表

Id  Name    Score
3   a   100
3   b   99
4   c   98
4   d   97

还有一个子表:

Id  New_Id
3   1
3   1
4   2
4   2

理想的输出是输出表:

Id  Name    Score
3   a   100
3   b   99
4   c   98
4   d   97
1   a   100
1   b   99
2   c   98
2   d   97

mysql fiddle在这里可用
http://sqlfiddle.com/#!9/91c1cf/6号机组
在输出表中,
我们可以看到id=1与id=3共享相同的信息。同样地,
我们可以看到id=2与id=4共享相同的信息。
有没有什么简单的方法,例如“insert into…select”、“copy”和“update”等,我们可以将id=3的数据复制到id=1,然后
将数据从id=4复制到id=2?
下面的查询确实生成了理想的输出,但是在我们的数亿行中,具有适当索引的连接仍然非常缓慢。在只有几十亿行的情况下,由于没有足够的ram和/tmp文件夹空间,作业甚至会失败。我们正在将我们的系统从mysql升级到一个更容易结痂的地方。但是,我们需要确保mysql系统在过渡期的几个月内能够正常工作。任何2美分都将不胜感激!

SELECT Id, Name, Score FROM MAIN

UNION

SELECT d.New_Id AS Id, c.Name, c.Score FROM MAIN c
RIGHT JOIN SUB d

ON c.Id = d.Id;
1u4esq0p

1u4esq0p1#

使用 INNER JOIN 而不是 RIGHT JOIN ,因为您不需要非匹配行产生的空行。你可以用 INSERT INTO ... SELECT 将这些新行添加到表中。而不是使用 UNION ,只需在新表中插入两个:

INSERT INTO OUTPUT (id, name, score)
SELECT id, name, score
FROM MAIN;

INSERT INTO OUTPUT (id, name, score)
SELECT d.new_id, c.name, c.score
FROM MAIN AS c
JOIN SUB AS d ON c.id = d.id;

只要你有索引就行了 id 两个输入表中的列这应该尽可能有效。
最后,当做大的 UNION 查询,使用 UNION ALL 如果您知道没有需要合并的重复项。 UNION 本身默认为 UNION DISTINCT ,因此需要创建一个临时表来保存所有要扫描的重复结果。

相关问题