2010-12-10 63 views
0

我爲我的客戶設置了一個上傳器(使用php),他們可以在他們的機器上選擇CSV(以預定格式)上傳。 CSV可能會有4000-5000行。 Php將通過讀取CSV的每一行來處理文件,並將其直接插入到數據庫表中。這部分很容易。然而,理想情況下,在將這些數據附加到數據庫表之前,我想回顧3列(A,B和C),並檢查是否已經有3個字段的匹配組合表和如果所以我寧願更新該行而不是追加。如果我沒有匹配那3列的組合,我想繼續並插入行,將數據附加到表中。可能有混合覆蓋/附加批處理寫入MySQL?

我的第一個想法是,我可以使列A,B和C成爲我表中的唯一索引,然後插入每一行,以某種方式檢測'失敗'的INSERT(由於我的唯一索引的限制)然後進行更新。似乎這種方法可能比爲每行創建一個單獨的SELECT查詢更有效,只是爲了查看我的表中是否有匹配的組合。

第三種方法可能是簡單地追加一切,不使用MySQL唯一索引,然後在客戶機稍後查詢該表時只抓取最新的唯一組合。但是我試圖避免在該表中有大量無用的數據。

有關最佳實踐或巧妙方法的想法?

回答

1

如果使3列聯合國ique id,您可以使用ON DUPLICATE KEY執行INSERT。

INSERT INTO table (a,b,c,d,e,f) VALUES (1,2,3,5,6,7) 
    ON DUPLICATE KEY UPDATE d=5,e=6,f=7; 

你可以在MySQL manual這裏閱讀更多關於這個方便的技術。

+0

非常方便的技術。 – phirschybar 2010-12-10 16:08:05

+0

很高興我能幫到你。這是我拾起的一個方便的技巧。 – 2010-12-10 19:32:24

1

如果您對(A,B,C)列添加一個唯一索引,那麼你可以使用REPLACE爲此在一個聲明:

更換作品酷似INSERT, 不同之處在於,如果一個老行的表 具有相同的值作爲一個 主鍵或唯一索引的新行,是 插入新行之前老 行被刪除...

+0

這將工作以及使用ON DUPLICATE。謝謝。 – phirschybar 2010-12-10 16:07:38