2012-09-06 52 views
0

我有一個函數使用CVS進口商有問題的原代碼如下插入數據到MySQL:我可以添加功能對重複密鑰更新

{ 
     $sql = "LOAD DATA INFILE '"[email protected]_escape_string($this->file_name). 
      "' INTO TABLE `".$this->table_name. 
      "` FIELDS TERMINATED BY '"[email protected]_escape_string($this->field_separate_char). 
      "' OPTIONALLY ENCLOSED BY '"[email protected]_escape_string($this->field_enclose_char). 
      "' ESCAPED BY '"[email protected]_escape_string($this->field_escape_char). 
      "' ". 
      ($this->use_csv_header ? " IGNORE 1 LINES " : "") 
      ."(`".implode("`,`", $this->arr_csv_columns)."`)"; 
     $res = mysql_query($sql); 
     $this->error = mysql_error(); 
    } 

我的問題是,我該怎麼辦,如果只有更新記錄到該表而不重新插入新記錄,因爲我想插入多個記錄,然後再次上載它們,但是使用字段#LL,其首先將爲空,然後更新將取值

+1

2件事 - 你應該使用mysql_real_escape_string()而不是mysql_escape_string(),它是不建議使用'@'錯誤抑制運算符。 –

回答

0

看起來像MySQL has support for temporary tables,所以一種解決方案是插入CSV d ata到臨時表中,然後將其加入永久數據以確定要更新哪些行。

簡單的例子(假設你的目標表被稱爲datatable,有一個主鍵叫做data_id,和列field_afield_b):

CREATE TEMPORARY TABLE temp_bulk_inserted_datatable LIKE datatable; 

LOAD DATA INFILE '/path/to/data.csv' INTO TABLE temp_bulk_inserted_datatable; 

-- Update rows that already exist with new data from the file 
UPDATE 
    datatable as OLD 
JOIN 
    -- Inner Join, so that only matching rows will be touched 
    temp_bulk_inserted_datatable as NEW 
    ON OLD.data_id = NEW.data_id 
SET 
    OLD.field_a = NEW.field_a, 
    OLD.field_b = NEW.field_b; 

-- Insert new rows from the CSV file which don't yet exist 
INSERT INTO datatable 
    (data_id, field_a, field_b) 
SELECT 
    NEW.data_id, NEW.field_a, NEW.field_b 
FROM 
    temp_bulk_inserted_datatable as NEW 
LEFT JOIN 
    -- Left Outer Join: we want to know about non-matches... 
    datatable as OLD 
    ON OLD.data_id = NEW.data_id 
WHERE 
    -- ...in fact, we want ONLY the non-matches 
    OLD.data_id IS NULL; 

DROP TABLE temp_bulk_inserted_datatable; 

(請注意,我不實際使用MySQL的,所以有些我的語法可能會略微偏離,但從我在手冊中讀到的內容來看,上面的內容應該是正確的。)

+0

你不能舉例嗎? –

+0

既然你問的很好(!)我已經提前爲你做了一個例子。希望澄清事情。 :) – IMSoP