0

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();
    }

私の質問は、複数のレコードを挿入してから再度アップロードする必要があるため、新しいレコードを再挿入せずにレコードをそのテーブルに更新するだけの場合、どのようにそれを行うことができるかです。更新は値を取ります

4

1 に答える 1

0

MySQLは一時テーブルをサポートしているようです。そのため、1つの解決策は、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を使用していないため、構文の一部が少しずれている可能性がありますが、マニュアルで読んだことから、上記は正しいはずです。)

于 2012-09-06T20:35:21.003 に答える