我有4个较大的MYSQL表 每个都有大约10万行。 这些表只包含一个唯一的ID。
某些表可能包含其他表中ID的重复项。我想将其中一个保留在最终的合并表中。
所以基本上我需要导出所有4个表并将它们组合成一个超过40万行的大表,没有重复。
使用相对较大的文件实现所有这一切的最佳方法是什么? 我在phpmyadmin中导出/导入时遇到了限制,因此可能必须从命令行执行此操作。
答案 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
。