2013-02-22 30 views
0

我有一個CSV文件,我想加載到我的MySQL數據庫。該文件大於10MB,並且有超過100,000行。我需要一個有效的方法來檢查一行是否已經在數據庫中,並添加新的條目。它用來自另一個第三方數據庫的最新數據更新數據庫。從CSV文件讀取並添加到數據庫,排除重複

看起來確實效率低下,逐行檢查並逐行添加。 另外,如果有幫助,CSV文件有一個日期字段。

+1

數據是否具有唯一ID或可以用作唯一標識符的東西? – 2013-02-22 18:15:09

+0

它總是有一個IIN(庫存號) – 2013-02-22 18:15:55

+0

如果IIN是一個鍵,您可以使用'ON DUPLICATE KEY UPDATE IIN = IIN'http://dev.mysql.com/doc/refman/5.0/en/insert-on- duplicate.html – AmazingDreams 2013-02-22 18:16:27

回答

0

首先,我會準備數據庫表,使其具有索引和唯一鍵。

然後,我會逐行解析CSV。如果重複,數據庫將不會接受該值,並且腳本將繼續。

如果您的CSV沒有唯一的字段,那麼您可以根據該行的所有數據字段創建一個散列並將其用作唯一鍵。 您可以使用類似產生一個唯一的密鑰:

md5(field1 + ":" + field2 + ":" + ... + ":" + fieldN)

0

我能想到的2種簡單的選擇。 查詢的DB 1時間和存儲的ID鍵控陣列

$data[$queryResult['fieldID']] = $queryResult; 

在整個結果集,並使用該快速驗證每個字段。 或者您可以使用INSERT IGNORE(將忽略該字段已存在並繼續下一個的警告)

+0

內存中的方法可以更快,但具有可怕的縮放特性和不一致性。 (如果將整個表讀入內存,開始處理文件,但其他人插入了一行?)INSERT IGNORE是解決此問題的一種方法,但該語法僅在MySQL上可用,並且忽略除重複以外的許多其他錯誤關鍵違規。 – MikeB 2013-02-22 18:32:32

+0

他帖子上的標籤包含MySQL ..它看起來不是一個併發插入的情況。 – Manatax 2013-02-22 18:34:06

+0

即使在獨立情況下,INSERT IGNORE也會忽略所有錯誤(例如,截斷和舍入)。 – MikeB 2013-02-22 20:45:11

相關問題