2014-01-07 107 views
4

我有一個腳本,用於將數據從一個數據庫遷移到另一個數據庫。我已經使用常規的mysql插入和更新腳本完成了。它只是需要太長時間。如何使用LOAD DATA LOCAL INFILE REPLACE

在任何情況下,我已經把我想要在新數據庫中更新的所有數據轉儲到csv,我只是擔心如果我運行此腳本,我將獲得重複的條目。我沒有匹配的「id」,所以我無法對下面列出的REPLACE腳本進行比較。我想知道是否有人能夠提醒我這個劇本看起來是否正確。

目前我在新的數據庫中有數據行,我只是想用csv中的新數據覆蓋新數據庫中的任何字段(如果它們匹配的話)。 「archived_id_number」字段是我可以匹配的唯一字段,但它不是主鍵。

能有人拍我的以下內容:

我想如果在CSV的archived_id_number相匹配的是,在新的DB與在CSV的數據替換字段中的任何數據。如果沒有匹配,我想將數據作爲新行插入。

$sql = ' 
LOAD DATA LOCAL INFILE "'.$theFile.'" 
REPLACE INTO TABLE Product 
FIELDS TERMINATED BY "|" 
LINES TERMINATED BY "\\n" 
(archived_id_number, sku, name, upc, account_id, shippingBox_id, unit_cost, supplier_id, description, productLength, productWidth, productHeight) 
;'; 

感謝您的幫助!

+0

儘管這不是一個主鍵,我想有一個'UNIQUE'上'archived_id_number'? – Wrikken

+0

是的,這是正確的,並且有一個獨特的sku – LargeTuna

+0

然後它應該盡我所能地看到沒有原始表格構建&csv片段。我先在表格的測試副本上運行它,但是... – Wrikken

回答

2

作爲我的評論的闡述,雖然您的查詢看起來不錯,我建議您對當前表的副本進行測試。這將允許您確切地確定會發生什麼,而不會冒現有數據的風險。您可以通過執行以下3個查詢來實現此目的(顯然,在PHP中執行$ sql)。

$sql = ' 
    CREATE TABLE `_test_Product` LIKE Product; 
'; 

$sql = ' 
    INSERT `_test_Product` SELECT * FROM Product; 
'; 

$sql = ' 
    LOAD DATA LOCAL INFILE "'.$theFile.'" 
    REPLACE INTO TABLE `_test_Product` 
    FIELDS TERMINATED BY "|" 
    LINES TERMINATED BY "\\n" 
    (
     archived_id_number, 
     sku, name, upc, account_id, shippingBox_id, unit_cost, 
     supplier_id, description, productLength, productWidth, productHeight 
    ); 
'; 

(在Duplicating a MySQL table, indexes and data提供更多信息)