一、导入导出场景及简单用法

都是基于文本文件

导入:

mysqlimport -usystem -p -S /usr/local/mysql/data/mysql.sock test --fields-terminated-by=',' /usr/local/mysql/tt3.txt

适用简单导入场景,导入文件名必须与对象名一致

load data infile ‘***file_name’ into table ***  fields terminated by ',';

适用复杂导入场景

导出:select * from tt4 into outfile '/tmp/***file_name.txt'  FIELDS terminated by ','  ;

二、MySQL 使用CSV存储引擎导入加载数据

1、查看csv文本文件中的内容

[root@localhost fire]# cat /tmp/ry.txt

10,ACCOUNTING,NEW YORK

20,RESEARCH,DALLAS

30,SALES,CHICAGO

40,OPERATIONS,BOSTON

2、--根据文本文件的格式创建CSV表

mysql>CREATE TABLE ry(

   deptno int(11) NOT NULL DEFAULT '0',

   dname varchar(15) NOT NULL,

   loc varchar(15) NOT NULL)

   ENGINE=CSV;

Query OK, 0 rows affected (0.06 sec)

3、将csv文本文件中的内容导入到创建表后生成的CSV文件中

[root@localhost fire]# more /tmp/dept.txt > ry.CSV

[root@localhost fire]# cat ry.CSV

10,ACCOUNTING,NEW YORK

20,RESEARCH,DALLAS

30,SALES,CHICAGO

40,OPERATIONS,BOSTON

4、查看导入到表中的数据

mysql> flush table ry; ---刷新表查询缓存,不然查询不到数据

mysql> select * from ry;

+--------+------------+----------+

| deptno | dname      | loc      |

+--------+------------+----------+

|     10 | ACCOUNTING | NEW YORK |

|     20 | RESEARCH   | DALLAS   |

|     30 | SALES      | CHICAGO  |

|     40 | OPERATIONS | BOSTON   |

+--------+------------+----------+

三、mysqlimport 命令行工具导入数据:(类似oralce Sql*Loader)  处理格式的数据比较方便

1、创建表


2、上传txt文件,命名与对象相同的名称

mv 1.txt tt3.txt

3、导入数据(test 为导入表在的库名)

mysqlimport -usystem -p -S /usr/local/mysql/data/mysql.sock test --fields-terminated-by=',' /usr/local/mysql/tt3.txt

4、查询数据

select * from tt3;

5、参数用法详解

输出定界格式文件,通过参数指定SQL格式输出,并且输出为实际数据的.txt文件和对象结构的.sql 文件

--fileds-terminated-by:指定列值的分隔符,默认值Tab符

--fields-enclosed-by:指定列值的包括符,默认值没有(对于字符中包含列分隔符的直接包括起来)例如:12#kk#2#4,2与4间包括了#,使用包括符后,”2#4“

--fields-optionally-enclosed-by: 指定非数字列的包括符,默认值没有(有就使用,没有就不使用)

--fields-escped-by:指定转义符,默认值转义符\

--lines-terminated-by:指定行结束符,默认值就是换行符

-d:导入前删除对象中数据

6、导入案例:

mysqlimport -usystem -p -S /usr/local/mysql/data/mysql.sock test -d --fields-terminated-by='#' /usr/local/mysql/tt3.txt

1#IN#北京#KK科技有限公司#郭三#22245

mysqlimport -usystem -p -S /usr/local/mysql/data/mysql.sock test -d --fields-terminated-by='#'  -fields-enclosed-by=\" /usr/local/mysql/tt3.txt

1#"IN"#"北京#KK科技有限公司"#"郭三"#"22245"


mysqlimport -usystem -p -S /usr/local/mysql/data/mysql.sock test -d --fields-terminated-by='#'  -fields-enclosed-by=\"  --lines-terminated-by='###\n' /usr/local/mysql/tt3.txt

1#"IN"#"北京#KK科技有限公司"#"郭三"#"22245"###

2#"IN"#"北京#KK科技有限公司"#"郭四"#"22246"###


四、使用LOAD DATA  (使用本地编辑的csv格式上传到服务器上,必须转换成unix格式,才能导入)

语法:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'

[REPLACE | IGNORE]

INTO TABLE tbl_name

[PARTITION (partition_name,...)]

[CHARACTER SET charset_name]

[{FIELDS | COLUMNS}

[TERMINATED BY 'string']

[[OPTIONALLY] ENCLOSED BY 'char']

[ESCAPED BY 'char']

]

[LINES

[STARTING BY 'string']

[TERMINATED BY 'string']

]

[IGNORE number {LINES | ROWS}]

[(col_name_or_user_var,...)]

[SET col_name = expr,...]

注意:load data 需要有处理文件的权限, GRANT FILE ON . TO user@host;

1、案例分析

CREATE TABLE tt14 (

 id int(11) NOT NULL,

 id_tye varchar(10) NOT NULL,

 zt_name varchar(60) NOT NULL,

 zdr_name varchar(20) NOT NULL,

 zdr_id varchar(20) NOT NULL

) ;

设置安全文件为空,不然导入文件必须在安全目录下


mysql>load data infile '/usr/local/mysql/data/test/4.txt'  into table tt14 fields terminated by ',';

1#"IN"#"北京#KK科技有限公司"#"郭三"#"22245"###

2#"IN"#"北京#KK科技有限公司"#"郭四"#"22246"###


关于字符集:数据文件的字符集与数据库字符集设置不同,导入会乱码。

解决方法:导入时指定处理数据的字符集(或者更改数据库字符集与数据文件一致set character_set_database=utf8mb4)

load data infile '/usr/local/mysql/data/test/4.txt' into table tt14  CHARACTER SET  utf8mb4 fields terminated by ',';

2、远程客户端导入

在客户端导入使用local参数,文件存放到客户端上

查看客户端 local_infile的状态,未开启的为OFF,利用set global local_infile=on;开启即可


mysql> load data local infile '/home/mysql/tt15.txt' into table tt15 fields terminated by ',';

3、冲突处理方式(有唯一约束或者主键的情况下)

[REPLACE | IGNORE]

指定 REPLACE ,出现重复会替换当前存在的记录

指定IGNORE ,出现重复跳过重复的记录

都未指定,处理依赖是否指定了LOCAL ,没有指定LOCAL,出现重复报错、指定LOCAL,处理行为与IGNORE一致。

mysql> load data local infile '/home/mysql/tt15.txt' ignore into table tt15 fields terminated by ',';

Query OK, 0 rows affected, 31 warnings (0.00 sec)

Records: 31  Deleted: 0  Skipped: 31  Warnings: 31

直接跳过

mysql> load data local infile '/home/mysql/tt15.txt' REPLACE into table tt15 fields terminated by ',';

Query OK, 31 rows affected (0.00 sec)

Records: 31  Deleted: 0  Skipped: 0  Warnings: 0

删除,重新插入

4、文件前N行不处理(GNORE N LINES;)

load data infile '/usr/local/mysql/data/test/3.csv' into table tt16 fields terminated by ',' IGNORE 1 LINES;

5、行和列的精确处理

[{FIELDS | COLUMNS}

[TERMINATED BY 'string']

[[OPTIONALLY] ENCLOSED BY 'char']

[ESCAPED BY 'char']

]

[LINES

[STARTING BY 'string']

[TERMINATED BY 'string']

]

输出定界格式文件,通过参数指定SQL格式输出,并且输出为实际数据的.txt文件和对象结构的.sql 文件

fileds terminated by:指定列值的分隔符,默认值Tab符(\t)

fields enclosed by:指定列值的包括符,默认值没有(对于字符中包含列分隔符的直接包括起来)例如:12#kk#2#4,2与4间包括了#,使用包括符后,”2#4“

fields escped by:指定转义符,默认值转义符\

lines terminated by:指定行结束符,默认值就是换行符(\n)

starting by :指定每行的开始位置(与字符有关)

(windows系统那么使用'\r\n' 表示换行)

案例:

5.1 字段与字段的分隔符不是’Tab‘ 处理

load data infile '/usr/local/mysql/data/test/3.csv' into table tt16 fields terminated by '#' ;

27#OUT#辽宁途途网约车运营服务有限公司#尚颖迪#D21361

5.2 数据行的行头包括的某些字符不希望导入

> 28,OUT,辽宁KK服务有限公司,尚XX,21361

> 29,OUT,辽宁KK服务有限公司,尚XX,21361

> 30,OUT,辽宁KK服务有限公司,SYSADMIN,sysadmin

> 31,OUT,辽宁KK服务有限公司,SYSADMIN,sysadmin

load data infile '/usr/local/mysql/data/test/3.csv' into table tt16 fields terminated by ',' LINES STARTING BY '>' ;


5.3 EXCEL 导入,先转换成CSV文件(CSV 默认分隔符',')

load data infile '/usr/local/mysql/data/test/3.csv' into table tt16 fields terminated by ',' ;

5.4列值中有特殊符号(使用包括符)

load data infile '/usr/local/mysql/data/test/3.csv' into table tt16 fields terminated by ','  enclosed by '"' ;

1#"IN"#"北京#KK科技有限公司"#"郭三"#"22245"

5.4 列值中包含包括符(处理方式:1、直接删除列值中的包括符2、使用转义符)

load data infile '/usr/local/mysql/data/test/3.csv' into table tt16 fields terminated by ','  enclosed by '"'  escped by ’|‘ ;

1#"IN"#"北京#KK科技|限公司"#"郭三"#"22245"

5.5 特殊关注符(windows文件使用\r\n 作为换行符)

windows上创建3.CSV 打包上传到linux服务器

load data infile '/usr/local/mysql/data/test/3.csv' into table tt16 fields terminated by ','  enclosed by '"'  escped by ’|‘  lines terminated by ’\r\n‘;

1#“IN”#“北京快#桔安|“运科|”技有限公司”#“郭薄”#“D22245”

5.6 列值中包含换行符

直接处理,只要被指定的包括符包含着,不管中间出现什么都不受影响(转义和包括符除外)

6、对象结构与数据文件不符

6.1表对象中的列比数据文件中的列少

Create Table: CREATE TABLE `tt17` (

 `id` int(11) NOT NULL,

 `id_tye` varchar(10) NOT NULL,

 `zt_name` varchar(60) NOT NULL,

 `zdr_name` varchar(20) NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

数据文件

1,IN,k,北京KKB公司,郭X,22245

2,IN,i,北京KKb公司,flpbot1_v,V098823

3,IN,b,深圳KK有限公司,flpbab,V004234

4,OUT,c,深圳市KK有限公司,汪X,22235

5,OUT,d,深圳市KK有限公司,汪X,22235

6,OUT,f,深圳市KK有限公司,汪X,22235

7,OUT,e,深圳市KK有限公司,汪X,22235

使用自定义变量代替不存在的字段(字段的顺序根据表顺序调整)

mysql>load data infile '/usr/local/mysql/data/test/7.txt' into table tt17 fields terminated by ','  (id,id_tye,@temp,zt_name,zdr_name,@tmp);

6.2 表对象中的列比数据文件中的列多

CREATE TABLE tt18 (
 id int NOT NULL  ,
 id_tye varchar(10) NOT NULL,
 zt_name varchar(60) NOT NULL,
 zdr_name varchar(20) NOT NULL,
 zdr_id varchar(20) NOT NULL,
 zdr_v varchar(20) NOT NULL
) ;

1,IN,,北京KKB有限公司,郭X,22245

2,IN,北京沃KKB有限公司,flpbot1_v,V00456

3,IN,深圳KKC有限公司,flpbot1_v,V00456

4,OUT,深圳市KK有限公司,汪X,22235

5,OUT,深圳市KK有限公司,汪X,22235

6,OUT,深圳市KK有限公司,汪X,22235

7,OUT,深圳市KK有限公司,汪X,22235

想导入几列就导入几列

mysql>load data infile '/usr/local/mysql/data/test/4.txt' into table tt18 fields terminated by ','  (id,id_tye,zt_name,zdr_name,zdr_id);

6.3 导入可以赋予其他的字段值

mysql>load data infile '/usr/local/mysql/data/test/4.txt' REPLACE into table tt18 fields terminated by ','  (id,id_tye,zt_name,zdr_name,zdr_id) set zdr_v='alan';
6.4 列值中字符类型不符
CREATE TABLE tt19 (
 id int NOT NULL  ,
 id_tye tinyint(10) NOT NULL,
 zt_name varchar(60) NOT NULL,
 zdr_name varchar(20) NOT NULL,
 zdr_id varchar(20) NOT NULL
) ;
1,IN,k,北京KKB公司,郭薄,D22245
2,IN,i,北京KKC有限公司,flpbot1_v,V00456
3,IN,b,深圳KKD有限公司,flpbot1_v,V00456
4,OUT,c,深圳市KK有限公司,汪X,22235
5,OUT,d,深圳市KK有限公司,汪X,22235
6,OUT,f,深圳市KK有限公司,汪X,22235
7,OUT,e,深圳市KK有限公司,汪X,22235
mysql>load data infile '/usr/local/mysql/data/test/7.txt'  into table tt19 fields terminated by ','  (id,@tmp_id_tye,@tmp,zt_name,zdr_name,zdr_id)  
set id_tye=if(@tmp_id_tye='IN',0,1);

导入直接处理,通过SET 子句,直接给某列赋值,在赋值时通过IF 判断前面变量的值,并返回不同的结果。

五、数据导出

SELECT ... INTO OUTFILE 'file_name'
       [CHARACTER SET charset_name]
       [export_options]
export_options:
   [{FIELDS | COLUMNS}
       [TERMINATED BY 'string']
       [[OPTIONALLY] ENCLOSED BY 'char']
       [ESCAPED BY 'char']
   ]
   [LINES
       [STARTING BY 'string']
       [TERMINATED BY 'string']
   ]
| INTO DUMPFILE 'file_name'
| INTO var_name[,var_name]
select * from tt19 into outfile '/tmp/tt19.txt';
select * from tt19 into outfile '/tmp/tt1901.txt' FIELDS terminated by ','  ;