2012-09-08 185 views
4

我目前使用mySQL LOAD DATA INFILE將csv文件插入到我的數據庫中。此csv文件每天下載到服務器以保持產品數據最新。mysql LOAD DATA INFILE更新

我想知道的是,如何使用新的csv更新表格並將其與現有數據保持不同?

這裏是我當前的語句:

LOAD DATA LOCAL INFILE '$file' REPLACE INTO TABLE products FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\' IGNORE 1 LINES (aw_product_id,merchant_id,merchant_image_url,aw_deep_link,description,in_stock,merchant_name,brand_name,display_price,product_name,rrp_price,merchant_category 

這工作得很好,但它有一個完全新的一組取代ID列,也將恢復,我想忽略,返回到默認狀態欄。例如,我有一個名爲'Published'的列,其值爲0或1.如果使用REPLACE,則將該列設置回0.

如何使用REPLACE但忽略某些列?

回答

5

的答案如何使用REPLACE但忽略某些列?你不能REPLACE allways替換一個完整的行,而不是該行的單個字段值。

答案我仍然可以實現我的目標雖然是:我的建議是LOAD DATA LOCAL INFILE到另一個表中,然後使用存儲過程或查詢INSERTUPDATE(相對於REPLACE)你的主表。如果您向我們提供更多信息(表格結構,哪一列與加載的數據與現有數據匹配),我們可能會爲您提供更多幫助。

+0

謝謝您確認我的懷疑! – veeTrain

1

如果增大/更改表:

首先LOAD DATA成tmp_table的。 然後用它來創建一個新的行或更新現有行:如果這個表是相當大的

INSERT INTO real_table 
    SELECT ... FROM tmp_table 
    ON DUPLICATE KEY UPDATE 
     a = VALUES(a), ... 

,認爲「分塊」那些IODKUs。請參閱my blog分塊技巧。

注:IODKU需要UNIQUE(可能爲PRIMARYKEY來控制哪一行到UPDATE

如果更換整個,那麼這是好多了:

CREATE TABLE new LIKE real; 
LOAD DATA ... INTO new; 
RENAME TABLE real TO old, new TO real; -- atomic and fast (no downtime) 
DROP TABLE old; 

更換

不要使用REPLACE;它是一個DELETE加上INSERT。如果你有AUTO_INCREMENT,那麼這些ID就會被扔掉(「燒」),幾個月後你可能會用完ID。

+0

你好朋友們,我有一個有7列的表,主鍵對我來說並不適用於這個查詢,因爲它基於列和值,我想從csv文件插入或更新單個列;問題是Duplicate沒有被正確使用,並且如果可能,對於這種情況:如果在一行中三個列A,B,C匹配它們的值(已經存在記錄),則執行更新;如果沒有匹配,則在隊列中插入一個插入。 –