2013-03-13 101 views
0

我,在我的程序LOAD DATA LOCAL INFILE查詢

<pre lang="SQL">LOAD DATA LOCAL INFILE 'C:\Users\mydesk\Desktop\dcc.csv' INTO TABLE DATAS.TABLE IN FIELDS TERMINATED BY ',' ENCLOSED BY '"' lines terminated by '\n'</pre> 

查詢,從csv文件上傳數據到MySQL。但是會出現「重複輸入PRIMARY KEY」錯誤的某些行和。我怎樣才能在每一行中捕獲這些異常並處理不同的查詢?

例如,我在csv文件中有10行,其中一些行與DATAS.TABLE中的行相同。所以當這樣的記錄插入表DATAS.TABLE時,我需要執行更新查詢。

回答

1

可以建議在第一遍中將數據從csv加載到臨時表中。

然後使用此臨時表來分兩步處理數據(1)從臨時表中更新現有行和(2)在第二遍中從臨時表中插入新行。

1

MySQL doc

替換,而忽略關鍵字 複製唯一鍵值的現有行輸入行的控制處理:

如果你指定REPLACE,輸入行會替換現有行。在其他 單詞中,主鍵或唯一索引 的值與現有行具有相同的值。請參見第13.2.7節「REPLACE語法」。

如果指定IGNORE,則會跳過在 唯一鍵值上覆制現有行的輸入行。如果您未指定任一選項,則 行爲取決於是否指定LOCAL關鍵字。如果沒有 LOCAL,則找到重複的鍵值時會發生錯誤,並且忽略該文本文件的其餘部分。對於LOCAL,默認行爲是 ,就像指定IGNORE一樣;這是因爲服務器沒有 的方式來停止在操作過程中傳輸文件。

所以如果你需要更新的行上重複值提在查詢REPLACE

1

我建議

  1. 創建一個臨時表,而不限制
  2. 數據裝載到該表第一
  3. 清潔,消毒,驗證(包括消除PK副本),轉換數據
  4. 將清潔數據插入您的事實表
  5. 截斷臨時表

通過該方法,您可以執行多步驟複雜驗證,與參考表和/或事實表一起查找不一致或其他問題。

在這種情況下,在暫存表上查找重複只是一個簡單的SELECT問題。