LOAD DATA INFILE 语句可以读取文本文件并导入数据库中。
在导入文件之前,你需要做如下准备:
导入文件的目标数据库
csv文件的列与目标数据库表的列的数量相同,并且每列的数据类型相同。
有插入数据权限的账户.
假设我们有数据表,命名位discounts有如下结构:
用 CREATE TABLE statement 创建discounts 如代码:
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文件包含第一行作为列名,其他行作为数据,
用以下语句来完成导入功能,例: 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; #忽略csv文件的第一行文件。
csv文件中,每列用逗号来分隔’,’ 用双引号’” ‘作为数据全文的结尾符。.
所有的 CSV 文件都是用 ‘\n’ 换行。.
因为文件第一行包含列名,所以,不应该导入数据表中,这里用 IGNORE 1 ROWS option.语句忽略第一行,保证不导入。
现在,我们可查看 discounts 表 看数据是否导入。
SELECT * FROM discounts;
导入数据过程中变更数据格式:
有时候,我们要导入的数据不符合目标数据的格式,简单的解决方式,你可以在导入数据过程中用set语句改变导入数据的格式;
expired date 数据是 mm/dd/yyyy 格式如下:
在导入过程中用str_to_date()函数来解决这个问题:
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’);
远程客户端导入数据
在本地电脑导入数据到远端的服务器,同样用LOAD DATA INFILE语句
当加入 LOCAL 参数在 LOAD DATA INFILE语句中 , 客户端会自动读取本地文件,然后将读取的数据发送到服务器端,文件会上传到服务器,临时文件在, C:\windows\temp on Windows 或 /tmp on Linux. 此文件不可配置或变更(新版本解除限制)
举例:
LOAD DATA LOCAL INFILE ‘c:/tmp/discounts.csv’
INTO TABLE discounts
FIELDS TERMINATED BY ‘,’
ENCLOSED BY ‘“‘
LINES TERMINATED BY ‘\n’
IGNORE 1 ROWS;
唯一一点不同就是用 LOCAL 参数,如果上传较大的文件,可能会慢一点,毕竟需要将文件上传到服务器需要时间。
通过本地上传文件不需要服务器的特别权限,