将CSV同时加载到MySQL表中

Bri*_*yer 4 mysql sql csv join load-data-infile

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

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

firstname | lastname
Run Code Online (Sandbox Code Playgroud)

目标表"名称"如下所示:

firstname | lastname | gender
Run Code Online (Sandbox Code Playgroud)

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

firstname | gender
Run Code Online (Sandbox Code Playgroud)

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

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

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

但是,我知道LOAD DATA LOCAL INFILE不能与JOIN结合使用,并且尝试对每一行使用INSERT加JOIN都是CPU密集型的.

有任何想法吗?

pet*_*erm 9

您可以使用SET子句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
    )
Run Code Online (Sandbox Code Playgroud)

确保:

  • 你有一个表中的firstname列索引gender
  • names在加载数据之前,表中没有任何索引.完成加载后添加它们(索引).


Gor*_*off 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;
Run Code Online (Sandbox Code Playgroud)

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