将CSV同时加载到MySQL表中

时间:2013-08-31 19:31:19

标签: mysql sql join csv load-data-infile

我要做的是将CSV上传到表中,同时使用JOIN将第三个表中的信息附加到目标表。

CSV import.csv(包含1M行)如下所示:

firstname | lastname

目标表“名称”如下所示:

firstname | lastname | gender

表“性别”(700k行)看起来像这样:

firstname | gender

所以,我理想的查询看起来像这样:

LOAD DATA LOCAL INFILE "import.csv"
INTO TABLE names n
LEFT JOIN gender g ON(g.firstname=n.firstname)

沿着这些方向,将导入与连接组合在一起,以便名称中的最终结果具有来自性别和CSV的数据。

但是,我知道LOAD DATA LOCAL INFILE不能与JOIN结合使用,并且每行尝试使用INSERT加JOIN都太占用CPU了。

有什么想法吗?

3 个答案:

答案 0 :(得分:9)

您可以使用SET的{​​{1}}条款来实现目标

LOAD DATA INFILE

确保:

  • LOAD DATA LOCAL INFILE '/path/to/your/file.csv' INTO TABLE names FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' -- or '\r\n' if file has been prepared in Windows IGNORE 1 LINES -- use this if your first line contains column headers (@first, @last) SET firstname = @first, lastname = @last, gender = ( SELECT gender FROM gender WHERE firstname = @first LIMIT 1 )
  • 中的firstname列上有索引
  • 在加载数据之前,gender表上没有任何索引。完成加载后添加它们(索引)。

答案 1 :(得分:2)

MySql LOAD DATA INFILE语法未定义JOIN。

  1. CREATA TABLE temporary_table ...
  2. LOAD DATA INFILE“import.csv”INTO TABLE temporary_table FIELDS TERMINATED BY'|'由'\ n';
  3. 终止的'''线路
  4. INSERT INTO names(t.firstname,t.lastname,g.gender)SELECT FROM temporary_table t LEFT JOIN gender g ON(g.firstname = n.firstname);

答案 2 :(得分:1)

根据我的经验,将数据加载到数据库的最佳方法是将其放在临时表中,其中所有列都是字符。然后,将数据库中的数据转换为最终输出。

将此应用于您的代码:

LOAD DATA LOCAL INFILE "import.csv"
INTO TABLE names_staging;

CREATE TABLE names as
    select n.firstname, n.lastname, g.gender
    from names_staging n LEFT JOIN
         gender g
         ON g.firstname = n.firstname;

这使得识别和修复数据加载中的问题成为可能。您还可以轻松地添加其他列,例如主键,并将日期插入到最终表中。