2017-09-27 9 views
1

我有4個較大的MYSQL表。
每個約1000萬行。 這些表格只包含一個唯一的ID。如何最好地合併四個大表

某些表可能在其他表中包含ID的重複項。我想只保留其中一個在最終的合併表中。

所以基本上我需要導出所有4個表並將它們組合成一個超過40萬行,沒有重複的大表。

什麼是最好的方式來實現這一切,相對較大的文件?? 我遇到了phpmyadmin導出/導入的限制,因此可能必須從命令行執行此操作。

回答

0

正如其他人所說,MySQL的支持INSERT IGNORE...這意味着嘗試插入一個選項,但對於每一行,如果它具有獨特的按鍵衝突(或導致像沒有一個NOT NULL或外鍵另一個錯誤檢查),它只需跳過該行並繼續插入下一行。

您可能知道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

+0

謝謝您的深入解答!有效 – KyleK

0

你可以做四個「插入」命令,或者UNION操作符也可以工作。

+0

這4個表都在單獨的服務器上。我需要轉儲/導出它們。那麼如何導入它們,但同時合併?或者我只做四個單獨的插入,並且重複的ID將被忽略?既然他們是獨一無二的? – KyleK

+0

您已經在執行轉儲/導出...您可以在導入之前執行一些操作來刪除重複項目嗎? – theGleep

0

MySql確實有INSERT IGNORE,它允許您愉快地從所有表中插入一個接一個。數據庫管理系統會照顧(放棄)複製品。

這可能不是最有效的選擇,但我認爲這將是一次性操作。

0

定義4個表,每個表的ID都是唯一的主鍵。 然後只需做一個所有4個表的外部連接。

+0

它們都在不同的服務器上。我不想將它們導入與單獨表相同的數據庫,然後加入。最好是Id想要在一個操作中完成。加入他們/一起插入他們在一起,進入決賽桌。我將如何去做這個?就像我mysqldumped所有SQL文件後,是否有一個命令合併/加入他們之前插入?或者是插入所有單獨然後加入的唯一方法? – KyleK