向MySQL数据库表内导入txt和csv文件数据

本文总结了在CentOS7上使用 LOAD DATA <LOCAL> INFILE 语句向MySQL8.0数据库导入txt文件和csv文件数据的方法和遇到的错误。由于两者方法一样,就先介绍导入txt文件的操作和错误,csv的直接在最后附上命令和简要说明。

原始数据

name owner species sex birth death
Fluffy Harold cat f 1993-02-04  
Claws Gwen cat m 1994-03-17  
Buffy Harold dog f 1989-05-13  
Fang Benny dog m 1990-08-27  
Bowser Diane dog m 1979-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11  
Whistler Gwen bird   1997-12-09  
Slim Benny snake m 1996-04-29  

准备txt文件

将空值用\N代替,每行数据内的分隔符为\t,行与行之间换行符为\r\n。然后将txt文件存放到/var/lib/mysql-files路径下。

准备数据表

mysql> use testdb2;
mysql> create table tbl_pet (
    -> name varchar(10),
    -> owner varchar(10),
    -> species varchar(10),
    -> sex varchar(1),
    -> birth date,
    -> death date)CHARSET = utf8;

导入数据

mysql> LOAD DATA INFILE '/var/lib/mysql-files/pet.txt' INTO TABLE tbl_pet LINES TERMINATED BY '\r\n';

导入后结果:

mysql> select * from tbl_pet;                                             
+----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
| Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
| Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
| Bowser   | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
+----------+--------+---------+------+------------+------------+
8 rows in set (0.00 sec)

可以向表内继续导入新的数据,会自动追加在原有记录的后面。

 

错误小结:

#Issue1:ERROR 1148 (42000): The used command is not allowed with this MySQL version

错误语句:mysql> LOAD DATA LOCAL INFILE '/var/lib/mysql/pet.txt' INTO TABLE tbl_pet;

出错原因:多了一个LOCAL关键词。当文件在客户机端时要写LOCAL,在服务器端时不用写。我的txt文件是和MySQL数据库在同一虚拟机上的,所以不用加LOCAL。

#Issue2:ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

出错原因:MySQL设置了secure-file-priv属性对应的路径,当数据文件从其他路径导入时便会报错。

扫描二维码关注公众号,回复: 10391019 查看本文章

解决办法:查看secure-file-priv指定路径并把数据文件放进去。参考https://blog.csdn.net/FallingU/article/details/75675220

mysql> show variables like '%secure%';
+--------------------------+-----------------------+
| Variable_name            | Value                 |
+--------------------------+-----------------------+
| secure_file_priv         | /var/lib/mysql-files/ |
+--------------------------+-----------------------+

#Issue3:ERROR 1292 (22007): Incorrect date value: '' for column 'death' at row 1

出错原因:一开始直接把原始表格里的数据复制到txt文件里没有处理,空值的地方是空的,不符合MySQL里空值的表示方式,所以报错。

解决办法:将空值用\N代替。参考https://dev.mysql.com/doc/refman/8.0/en/loading-tables.html

#Issue4:使用 LOAD DATA INFILE '/var/lib/mysql-files/pet.txt' INTO TABLE tbl_pet; 导入数据仍然失败

错误提示:' for column 'death' at row 1 date value: 'N

出错原因:fields terminated by 默认值是'\t',lines terminated by 默认值是'\n',而Windows上的文件换行是'\r\n',Mac OS X是'\r'。

解决办法:加上LINES TERMINATED BY '\r\n',如下:

mysql> LOAD DATA INFILE '/var/lib/mysql-files/pet.txt' INTO TABLE tbl_pet LINES TERMINATED BY '\r\n';


导入csv文件数据

原始数据文件:来源https://blog.csdn.net/u013378642/article/details/80952849

mysql> use testdb;

mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| movie_tbl        |
+------------------+

mysql> desc movie_tbl;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| movie_id    | int(11)          | YES  |     | NULL    |                |
| movie_name  | varchar(40)      | NO   |     | NULL    |                |
| movie_score | float unsigned   | YES  |     | NULL    |                |
| region      | varchar(16)      | YES  |     | NULL    |                |
| year        | year(4)          | YES  |     | NULL    |                |
| movie_type  | varchar(30)      | YES  |     | NULL    |                |
| director    | varchar(80)      | YES  |     | NULL    |                |
| actor       | varchar(60)      | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

mysql> LOAD DATA INFILE '/var/lib/mysql-files/Movies.csv' INTO TABLE movie_tbl
    -> CHARACTER SET utf8
    -> FIELDS TERMINATED BY ','
    -> LINES TERMINATED BY '\r\n'
    -> IGNORE 1 LINES
    -> (movie_id,movie_name,movie_score,region,year,movie_type,director,actor);

补充说明:

1. CHARACTER SET utf8:因为有中文数据,所以指定utf-8编码。

2. FIELDS TERMINATED BY ',':csv文件以 ',' 分隔数据。

3. IGNORE 1 LINES:跳过原始文件中的第一行表头数据。如果不写,表头也会被当作数据导入。如果要跳过从头开始的多行,可以改变LINES前面的数字。

4. 要导入数据的字段放在最后,将字段顺序和原始文件里的顺序保持一致。

The End ~

发布了37 篇原创文章 · 获赞 47 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/u013378642/article/details/81220809