2017-05-09 81 views
0

我有一個站點處理CSV文件的上傳並將它們插入數據庫。 CSV模板有229個字段,每個文件有多行。由於有多行,因此有時可能會有兩個CSV文件具有來自先前文件的記錄,我想避免重複。SQL避免重複被插入登臺/臨時表

我有CSV文件當前正在上傳到230字段暫存表(比CSV自動增量主鍵更多的字段),然後他們分裂成更小的表。

我的問題:上傳CSV時,我希望任何已存在的記錄覆蓋或忽略,以便每個229字段記錄只有一個。

有沒有辦法在臨時表上做到這一點,所以我不必擔心小表?通過要明顯他們每一列

select * 
from `table` 
group by Col1, Col2, Col3 [,...] 
having count(*) = 1 
order by id asc; 

基本上,選擇所有記錄,然後將它們組:

+1

具有值你看了[重複鍵](https://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html)語法?除非我錯了,那是你在找什麼? – Burki

回答

1

如果所有以前導入的記錄是在臨時表中,你可以使用這樣的事情並通過組計數過濾結果(組計數> 1時有多個相同的記錄)。 之後,您只需要篩選新添加的記錄。

但請記住,如果在同一個csv文件中有重複的可能性,它們將被此方法忽略。如果是這種情況,您可以首先使用不同的數據集。

+0

我想我原本是傾向於不同的第一個,只是因爲有這麼多的領域。這很奇怪,但這些CSV文件都有幾行,每行都有229個字段,爲了方便起見,我將每個行導入到230字段臨時表中,然後再分割爲更小的行。由於我們現在正在使用一個CSV進行測試,因此每次上傳時都會填滿,我們不得不截斷。我能否以檢查多個字段的方式使用不同的第一個字段?喜歡,如果工單號,序號,帳號和日期是一樣的? –

+0

@TomN。獨特性僅適用於結果集中的字段。所以如果你想區分所有的列,你必須使用'select distinct *',如果你只想用兩個字段來區分,那麼使用'select distinct field1,field2,filed3 [,...]'。 – Derenir

0

先裝入文件數據到temp_table,然後運行一個查詢

SELECT * FROM temp_table INTO target_table 
WHERE temp_table.value NOT IN (SELECT value FROM target_table) 

這裏temp_table.value是由你定義是否存在複製已經排在target_table