2012-09-06 53 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