问题:把一个本地的文件(比如.txt或.csv文件)导入到指定的一张MySQL表中。可以使用mysqlimport或者LOAD DATA
命令来完成。这篇文章仅仅是简单介绍一下mysqlimport和LOAD DATA
的简单用法。关于LOAD DATA
的详细说明,参考What Happens When Using LOAD DATA。
1. Prework:创建测试表和文件
首先创建一个测试表:
CREATE TABLE one_piece (
`no` INT,
`name` VARCHAR(15)
);
然后创建一个测试文件:
cat one_piece.txt
no name
100 luffy
200 zoro
300 nami
400 usopp
500 sanji
600 chopper
700 robin
800 franky
900 brook
1000 jinbe
2. 使用mysqlimport导入文件
使用下面的命令可以将上面创建的one_piece.txt的内容导入表中:
mysqlimport --ignore-lines=1 \
--fields-terminated-by='\t' \
--local \
-h host \
-P port \
-u username \
-p db_name \
/path/to/one_piece.txt
执行后会让输入密码,之后就执行成功了。
还可以直接在-p
后面添加密码,这样就不需要手动输入了:-pyourpassword
。
可以查看一下:
SELECT * FROM one_piece;
结果:
+------+---------+
| no | name |
+------+---------+
| 100 | luffy |
| 200 | zoro |
| 300 | nami |
| 400 | usopp |
| 500 | sanji |
| 600 | chopper |
| 700 | robin |
| 800 | franky |
| 900 | brook |
| 1000 | jinbe |
+------+---------+
需要注意的是,导入的文件名需要和对应的表名一样,比如上面的one_piece.txt和对应的表名one_piece。不然会找不到表名。
3. 导入多个文件到多张表中
使用上面的命令我们可以将多个文件导入多张表中:
mysqlimport --ignore-lines=1 \
--fields-terminated-by='\t' \
--local \
-h host \
-P port \
-u username \
-p db_name \
/path/to/one_piece.txt
/path/to/steins_gate.txt
4. 指定导入的字段
如果想只导入指定的字段,可以使用--columns
选项(也叫-c
)。字段使用英文逗号隔开。比如:
mysqlimport --ignore-lines=1 \
--fields-terminated-by='\t' \
--columns no,name
--local \
-h 10.55.142.100 \
-P3596 \
-u db_szdev \
-p test \
/path/to/one_piece.txt
/path/to/steins_gate.txt
5. 使用LOAD DATA
导入文件
mysqlimport其实是对LOAD DATA
的一层封装,这样我们就可以使用LOAD DATA
导入文件:
LOAD DATA LOCAL INFILE '/path/to/one_piece.txt'
INTO TABLE one_piece
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(no,name);
结果是一样的。
6. mysqlimport常用选项
mysqlimport的参数比较多,接下来看看一些常用的参数:
--ignore-lines
:用来标识忽略的行数,比如如果文件有表头的话,可以忽略这一行;
--fields-terminated-by
:用来标识字段分隔符,常用的有\t
和,
;
--local
:表示读取本地文件,如果不加的话就会出错;
--delete
:在导入之前先删除所有的数据;
-h
和-P
:表示MySQL服务器的地址,不加的话就是本地的MySQL服务器;
-p
:使用密码;
后面的test
就是对应的数据库名。