【MySQL】CSV 文件导入MySQL

此问题是前几天整理数据的时候碰到的,数据存在 CSV文件中(200多万记录),经过python 往数据库中导入太慢了,后来使用MySQL 中自带的命令 LOAD DATA INFILE, 30多秒就可以完成二三百万的数据量导入。html

LOAD DATA INFILE 命令容许你读取文本文件而后很是快速的插入数据库。python

导入文件以前,你须要准备如下的内容:mysql

  • 建立相应数据的数据库表格。
  • CSV 文件中的数据须要和数据库表格在列数数据类型保持一致。
  • 具备写入数据库的文件和插入权限的帐户

    假定咱们拥有一个 discounts 的表格,结构以下:

咱们使用 [CREATE TABLE statement][1]命令建立 discounts 表格:linux

CREATE TABLE discounts (
    id INT NOT NULL AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    expired_date DATE NOT NULL,
    amount DECIMAL(10 , 2 ) NULL,
    PRIMARY KEY (id)
);

discounts.csv 文件的首行做为列名称,其余三行为数据。sql

如下的命令使得 c:\tmp\discounts.csv 的文件存入 discounts表格。数据库

LOAD DATA INFILE 'c:/tmp/discounts.csv' 
INTO TABLE discounts 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

文件中的数据阈由逗号分隔开,代码中反映为 FIELD TERMINATED BY ',' ,并且数据由双引号包围,经过 ENCLOSED BY '" ‘ 标明
CSV 中的换行标记由 LINES TERMINATED BY '\n' 进行说明。windows

另外:文件中的首行是标题并须要存入数据库表格中,所以经过IGNORE 1 ROWS进行忽略。安全

导入数据转换格式


有时数据的格式并不知足数据库表格中目标列的格式。简单的状况下,你能够在LOAD DATA INFILE 中设置 set 选项 以转换数据服务器

假定 discount_2.csv 文件中的过时时间列 是mm/dd/yyyy 的格式。code

当向 discounts 表格中导入数据时,咱们必须经过 str_to_date() function 转换成MySQL日期的格式

LOAD DATA INFILE 'c:/tmp/discounts_2.csv'
INTO TABLE discounts
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(title,@expired_date,amount)
SET expired_date = STR_TO_DATE(@expired_date, '%m/%d/%Y');

客户端向远程MySQL数据库导入数据


使用命令 LOAD DATA INFILE从客户端(本地电脑)向远程MySQL数据库导入数据是彻底可行的。

当你使用LOAD DATA INFILE 中的LOCAL 选项,客户端程序读取本地的文件,而后将其发送到MySQL server。文件将被上传到服务器端相应的临时目录内,好比 WindowsC:\windows\templinux/temp
此文件夹没法被MySQL配置或占用。

咱们看看下面的例子:

LOAD DATA LOCAL INFILE  'c:/tmp/discounts.csv'
INTO TABLE discounts
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

惟一的差异在于命令中的 LOCAL 选项。若是你须要load 一个大的CSV文件,你会注意到LOCAL 选项,它会比平时慢一些,由于更多时间浪费在数据传输上面。

当你使用 LOCAL 选项时,链接 MySQL server的帐户并不须要文件权限来导入数据。

使用 LOAD DATA LOCAL 导入本地文件到远程 MySQL服务端,须要注意一些安全问题,你必须意识到这些问题以规避潜在的安全风险。

此文章转载自:http://www.mysqltutorial.org/import-csv-file-mysql-table/