当前位置:嗨网首页>书籍在线阅读

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'。