13-导入
本节只讨论用SELECT…INTO OUTFILE或者mysqldump导出的纯数据文本的导入方法。和导出类似,导入也有两种不同的方法,分别是LOAD DATA INFILE…和mysqlimport,它们的本质是一样的,区别只是在于一个在MySQL内部执行,另一个在MySQL外部执行。
1.方法1
使用“LOAD DATA INFILE…”命令,具体语法如下。
mysql > LOAD DATA [LOCAL] INFILE 'filename' INTO TABLE tablename [option]
option可以是以下选项:
FIELDS TERMINATED BY 'string'(字段分隔符,默认为制表符'\t');
FIELDS [OPTIONALLY] ENCLOSED BY 'char'(字段引用符,如果加OPTIONALLY选项则只用在char、varchar和text等字符型字段上。默认不使用引用符);
FIELDS ESCAPED BY 'char'(转义字符,默认为'\');
LINES STARTING BY 'string'(每行前都加此字符串,默认为');
LINES TERMINATED BY 'string'(行结束符,默认为'\n');
IGNORE number LINES(忽略输入文件中的前 n行数据);
(col_name_or_user_var,...) (按照列出的字段顺序和字段数量加载数据);
SET col_name = expr,...将列做一定的数值转换后再加载。
其中char表示此符号只能是单个字符,string表示可以是字符串。
FILELD、LINES和前面SELECT…INTO OUTFILE…的含义完全相同,不同的是多了几个不同的选项,下面的例子将文件“/tmp/emp.txt”中的数据加载到表emp中:
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ;
Query OK, 4 rows affected (0.03 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from emp;
+------+------+---------+
| id | name | content |
+------+------+---------+
| 2 | z1 | aa |
| 3 | z1 | aa |
| 4 | z1 | aa |
| 1 | z1 | aa|
+------+------+---------+
4 rows in set (0.00 sec)
如果不希望加载文件中的前两行,可以进行如下操作:
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines;
Query OK, 2 rows affected (0.04 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from emp;
+------+------+---------+
| id | name | content |
+------+------+---------+
| 4 | z1 | aa |
| 1 | z1 | aa |
+------+------+---------+
2 rows in set (0.00 sec)
此时数据只加载了两行,对比一下数据文件,可以发现的确只加载了后两行:
mysql> system /tmp/emp.txt
sh: /tmp/emp.txt: Permission denied
mysql> system more /tmp/emp.txt
2,"z1","aa"
3,"z1","aa"
4,"z1","aa"
1,"z1","aa"
如果发现文件中的列顺序和表中的列顺序不符,或者只想加载部分列,可以在命令行中加上列的顺序,如下例所示:
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines (id,content,name);
Query OK, 2 rows affected (0.05 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from emp;
+------+------+---------+
| id | name | content |
+------+------+---------+
| 4 | aa | z1 |
| 1 | aa | z1 |
+------+------+---------+
2 rows in set (0.00 sec)
可以发现,文件中第二列的内容放到了content里面,第三列的内容放到了name里面。
如果只想加载第一列,字段的列表里面可以只加第一列的名称:
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines (id);
Query OK, 2 rows affected, 2 warnings (0.04 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 2
mysql> select * from emp;
+------+------+---------+
| id | name | content |
+------+------+---------+
| 4 | NULL | NULL |
| 1 | NULL | NULL |
+------+------+---------+
2 rows in set (0.00 sec)
如果希望将id列的内容加上10后再加载到表中,可以如下操作:
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' set id=id+10;
Query OK, 4 rows affected (0.03 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from emp;
+------+------+---------+
| id | name | content |
+------+------+---------+
| 12 | z1 | aa |
| 13 | z1 | aa |
| 14 | z1 | aa|
| 11 | z1 | aa |
+------+------+---------+
4 rows in set (0.00 sec)
2.方法2
用mysqlimport来实现,具体命令如下。
Shell> mysqlimport –u root –p*** [- -LOCAL] dbname order_tab.txt [option]
其中option参数可以是以下选项:
--fields-terminated-by=name(字段分隔符);
--fields-enclosed-by=name(字段引用符);
--fields-optionally-enclosed-by=name(字段引用符,只用在char、varchar和text等字符型字段上);
--fields-escaped-by=name(转义字符);
--lines-terminated-by=name(记录结束符);
-- ignore-lines=number(忽略前几行)。
这与mysqldump的选项几乎完全相同,这里不再详细介绍,简单来看一个例子:
[root@localhost tmp]# mysqlimport -uroot test /tmp/emp.txt --fields-terminated-by= ','--fields-enclosed-by='"'
test.emp: Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
[root@localhost tmp]#
[root@localhost tmp]# mysql -uroot test -e 'select count(10) from emp'
+-----------+
| count(10) |
+-----------+
| 4 |
+-----------+
[root@localhost tmp]# mysql -uroot test -e 'select * from emp'
+------+------+---------+
| id | name | content |
+------+------+---------+
| 2 | z1 | aa|
| 3 | z1 | aa|
| 4 | z1 | aa|
| 1 | z1 | aa|
+------+------+---------+
注意:如果导入和导出是跨平台操作的(Windows和Linux),那么要注意设置参数 line-terminated- by, Windows上设置为 line-terminated-by= '\r\n',Linux上设置为 line- terminated-by='\n'。