如何最好地合并四个大表

时间:2017-09-27 14:22:40

标签: mysql merge

我有4个较大的MYSQL表 每个都有大约10万行。 这些表只包含一个唯一的ID。

某些表可能包含其他表中ID的重复项。我想将其中一个保留在最终的合并表中。

所以基本上我需要导出所有4个表并将它们组合成一个超过40万行的大表,没有重复。

使用相对较大的文件实现所有这一切的最佳方法是什么? 我在phpmyadmin中导出/导入时遇到了限制,因此可能必须从命令行执行此操作。

4 个答案:

答案 0 :(得分:0)

你可以做四个“插入”命令,或者UNION操作符也可以工作。

答案 1 :(得分:0)

MySql确实有INSERT IGNORE,允许您一个接一个地从所有表中愉快地插入。 DBMS将照顾(在丢弃意义上)重复项。

这可能不是最有效的选择,但我认为它将是一次性操作。

答案 2 :(得分:0)

定义4个表,每个表的ID为唯一主键。 然后只需对所有4个表进行外连接。

答案 3 :(得分:0)

正如其他人所提到的,MySQL支持INSERT IGNORE...的选项,这意味着尝试插入,但对于每一行,如果它与唯一键冲突(或导致另一个错误,如如果没有NOT NULL或FOREIGN KEY检查,它只会跳过该行并继续插入下一行。

您可能知道MySQL附带的mysqldump工具。它可以选择使用INSERT IGNORE语法导出数据。

您还想省略CREATE TABLE,因为如果您要将四个数据集导入同一目标表,则不需要四次创建表。

所以这就是我的建议:

在您的一台服务器上,仅获取表定义。如果它们完全相同,那么从哪个服务器获取此信息并不重要:

mysqldump --no-data mydatabase mytable > create.sql

然后只从四台服务器中获取数据:

mysqldump --no-create-info --insert-ignore mydatabase mytable > data1.sql

(同样适用于data2.sql,data3.sql,data4.sql,每个服务器一个)

将转储文件复制到要合并数据的服务器。

创建表格:

mysql mydestdatabase < create.sql

加载所有数据:

pv -pert data*.sql | mysql mydestdatabase

我喜欢使用pv -pert,因为它显示了一个进度条。您可能必须安装pv,因为在大多数系统上默认情况下它不存在。如果您不想这样做,请使用cat