【问题标题】:I can add the function as ON DUPLICATE KEY UPDATE我可以将该功能添加为 ON DUPLICATE KEY UPDATE
【发布时间】:2012-08-31 16:03:31
【问题描述】:

我有一个使用cvs importer向mysql插入数据的函数问题原代码如下:

{
      $sql = "LOAD DATA INFILE '".@mysql_escape_string($this->file_name).
             "' INTO TABLE `".$this->table_name. 
             "` FIELDS TERMINATED BY '".@mysql_escape_string($this->field_separate_char).
             "' OPTIONALLY ENCLOSED BY '".@mysql_escape_string($this->field_enclose_char).
             "' ESCAPED BY '".@mysql_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,它首先是null 然后更新将取值

【问题讨论】:

  • 两件事 - 你应该使用mysql_real_escape_string(),而不是mysql_escape_string(),并且不建议使用@ 错误抑制运算符。

标签: php mysql csv insert-update


【解决方案1】:

它看起来像 MySQL has support for temporary tables,因此一种解决方案是将 CSV 数据插入到临时表中,然后将其连接到永久数据中以确定要更新的行。

简化示例(假设您的目标表名为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,因此我的某些语法可能会略有偏差,但从我在手册中阅读的内容来看,上述内容应该是正确的。)

【讨论】:

  • 既然你问得这么好(!)我已经继续为你举了一个例子。希望能澄清事情。 :)
猜你喜欢
  • 2014-03-10
  • 2011-06-29
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 2013-10-03
相关资源
最近更新 更多