继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

我们来看看load data infile 需要注意的一些地方

largeQ
关注TA
已关注
手记 824
粉丝 92
获赞 585


我的文章一般浅显易懂,不会搞那么深入让大家很难理解。(其实我水平也不咋样)

LOAD DATA INFILE 一直被认为是MySQL很强大的一个数据导入工具,因为他速度非常的快。

不过有几个问题一定要注意

1、编码。

2、灵活导入导出。

我来举两个例子说明一下。

一、关于编码

我们的示例文本文件:

"我爱你","20","相貌平常,经常耍流氓!哈哈"

"李奎","21","相貌平常,经常耍流氓!哈哈"

"王二米","20","相貌平常,经常耍流氓!哈哈"

"老三","24","很强"

"老四","34","XXXXX"

"老五","52","***%*¥*¥*¥*¥"

"小猫","45","中间省略。。。"

"小狗","12","就会叫"

"小妹","21","PP的很"

"小坏蛋","52","表里不一"

"上帝他爷","96","非常英俊"

"MM来了","10","。。。"

"歌颂党","20","社会主义好"

"人民好","20","的确是好"

"老高","10","学习很好"

"斜三","60","眼睛斜了"

"中华之子","100","威武的不行了"

"大米","63","我爱吃"

"苹果","15","好吃"

我们的示例表结构:

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

| Table | Create Table                                                                                                                                                                                                                                                          |

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

| t0    | CREATE TABLE `t0` (

  `id` bigint(20) unsigned NOT NULL auto_increment,

  `name` char(20) NOT NULL,

  `age` tinyint(3) unsigned NOT NULL,

  `description` text NOT NULL,

  PRIMARY KEY  (`id`),

  UNIQUE KEY `idx_name` (`name`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 | 

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

1 row in set (0.00 sec)

我们把这个文本文件从WINDOWS 下COPY到LINUX下看看

mysql> load data infile '/tmp/t0.txt' ignore into table t0 character set gbk fields terminated by ',' enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`);

Query OK, 19 rows affected (0.01 sec)

Records: 19  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from t0;

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

| id | name     | age | description                |

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

|  1 | 我爱你   |  20 | 相貌平常,经常耍流氓!哈哈 | 

|  2 | 李奎     |  21 | 相貌平常,经常耍流氓!哈哈 | 

|  3 | 王二米   |  20 | 相貌平常,经常耍流氓!哈哈 | 

|  4 | 老三     |  24 | 很强                       | 

|  5 | 老四     |  34 | XXXXX                      | 

|  6 | 老五     |  52 | ***%*¥*¥*¥*¥           | 

|  7 | 小猫     |  45 | 中间省略。。。             | 

|  8 | 小狗     |  12 | 就会叫                     | 

|  9 | 小妹     |  21 | PP的很                     | 

| 10 | 小坏蛋   |  52 | 表里不一                   | 

| 11 | 上帝他爷 |  96 | 非常英俊                   | 

| 12 | MM来了   |  10 | 。。。                     | 

| 13 | 歌颂党   |  20 | 社会主义好                 | 

| 14 | 人民好   |  20 | 的确是好                   | 

| 15 | 老高     |  10 | 学习很好                   | 

| 16 | 斜三     |  60 | 眼睛斜了                   | 

| 17 | 中华之子 | 100 | 威武的不行了               | 

| 18 | 大米     |  63 | 我爱吃                     | 

| 19 | 苹果     |  15 | 好吃                       | 

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

19 rows in set (0.00 sec)

我来说明一下相关的参数

关于我的导入语句,我现在直说两个,其他的参考手册。

character set gbk;

这个字符集一定要写,要不然就会乱码或者只导入一部分数据。

ignore into table 

因为name 列加了唯一索引,加这个是为了避免重复数据插入报错。

加入我们再次运行这个导入语句就会发现

Query OK, 0 rows affected (0.00 sec)

Records: 19  Deleted: 0  Skipped: 19  Warnings: 0

没有任何值导入,因为里面已经有了相同的值。

这里也可以用replace into table

MySQL会把相同的先干掉,再插入新的值。

mysql> load data infile '/tmp/t0.txt' replace into table t0 character set gbk fields terminated by ',' enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`);

Query OK, 38 rows affected (0.00 sec)

Records: 19  Deleted: 19  Skipped: 0  Warnings: 0

mysql> select * from t0;

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

| id | name     | age | description                |

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

| 20 | 我爱你   |  20 | 相貌平常,经常耍流氓!哈哈 | 

| 21 | 李奎     |  21 | 相貌平常,经常耍流氓!哈哈 | 

| 22 | 王二米   |  20 | 相貌平常,经常耍流氓!哈哈 | 

| 23 | 老三     |  24 | 很强                       | 

| 24 | 老四     |  34 | XXXXX                      | 

| 25 | 老五     |  52 | ***%*¥*¥*¥*¥           | 

| 26 | 小猫     |  45 | 中间省略。。。             | 

| 27 | 小狗     |  12 | 就会叫                     | 

| 28 | 小妹     |  21 | PP的很                     | 

| 29 | 小坏蛋   |  52 | 表里不一                   | 

| 30 | 上帝他爷 |  96 | 非常英俊                   | 

| 31 | MM来了   |  10 | 。。。                     | 

| 32 | 歌颂党   |  20 | 社会主义好                 | 

| 33 | 人民好   |  20 | 的确是好                   | 

| 34 | 老高     |  10 | 学习很好                   | 

| 35 | 斜三     |  60 | 眼睛斜了                   | 

| 36 | 中华之子 | 100 | 威武的不行了               | 

| 37 | 大米     |  63 | 我爱吃                     | 

| 38 | 苹果     |  15 | 好吃                       | 

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

19 rows in set (0.00 sec)

 (`name`,`age`,`description`);

这些也就是具体的表属性了,指明这个就可以导入想要的数据。

2、关于灵活性,其实也就是一个记录功能

如果想在导入的时候记录一下导入的具体时间怎么办?

我们来看看

先加一个时间属性记录导入时间。

mysql> alter table t0 add update_time timestamp not null;

Query OK, 19 rows affected (0.00 sec)

Records: 19  Duplicates: 0  Warnings: 0

干掉唯一索引

mysql> alter table t0 drop index idx_name;

Query OK, 19 rows affected (0.00 sec)

Records: 19  Duplicates: 0  Warnings: 0

mysql> load data infile '/tmp/t0.txt' into table t0 character set gbk fields terminated by ',' enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`) set update_time=current_timestamp;

Query OK, 19 rows affected (0.00 sec)

Records: 19  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from t0;

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

| id | name     | age | description                | update_time         |

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

| 20 | 我爱你   |  20 | 相貌平常,经常耍流氓!哈哈 | 0000-00-00 00:00:00 | 

…………

| 24 | 老四     |  34 | XXXXX                      | 0000-00-00 00:00:00 | 

| 25 | 老五     |  52 | ***%*¥*¥*¥*¥           | 0000-00-00 00:00:00 | 

…………

| 35 | 斜三     |  60 | 眼睛斜了                   | 0000-00-00 00:00:00 | 

| 36 | 中华之子 | 100 | 威武的不行了               | 0000-00-00 00:00:00 | 

…………

| 60 | 王二米   |  20 | 相貌平常,经常耍流氓!哈哈 | 2008-06-30 14:58:37 | 

…………

| 68 | 上帝他爷 |  96 | 非常英俊                   | 2008-06-30 14:58:37 | 

| 69 | MM来了   |  10 | 。。。                     | 2008-06-30 14:58:37 | 

…………

| 75 | 大米     |  63 | 我爱吃                     | 2008-06-30 14:58:37 | 

| 76 | 苹果     |  15 | 好吃                       | 2008-06-30 14:58:37 | 

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

38 rows in set (0.00 sec)

新导入的19条记录时间被记录了下来。

只是之前的数据库没有记录,不过现在不需要这些重复数据了。

干掉他就可以了

mysql> alter table t0 order by id desc;

Query OK, 38 rows affected (0.01 sec)

Records: 38  Duplicates: 0  Warnings: 0

mysql> alter ignore table t0 add unique index idx_name (`name`);

Query OK, 38 rows affected (0.00 sec)

Records: 38  Duplicates: 19  Warnings: 0

mysql> alter table t0 order by id asc;

Query OK, 19 rows affected (0.01 sec)

Records: 19  Duplicates: 0  Warnings: 0

mysql> select * from t0;

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

| id | name     | age | description                | update_time         |

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

| 58 | 我爱你   |  20 | 相貌平常,经常耍流氓!哈哈 | 2008-06-30 14:58:37 | 

| 59 | 李奎     |  21 | 相貌平常,经常耍流氓!哈哈 | 2008-06-30 14:58:37 | 

| 60 | 王二米   |  20 | 相貌平常,经常耍流氓!哈哈 | 2008-06-30 14:58:37 | 

| 61 | 老三     |  24 | 很强                       | 2008-06-30 14:58:37 | 

| 62 | 老四     |  34 | XXXXX                      | 2008-06-30 14:58:37 | 

| 63 | 老五     |  52 | ***%*¥*¥*¥*¥           | 2008-06-30 14:58:37 | 

| 64 | 小猫     |  45 | 中间省略。。。             | 2008-06-30 14:58:37 | 

| 65 | 小狗     |  12 | 就会叫                     | 2008-06-30 14:58:37 | 

| 66 | 小妹     |  21 | PP的很                     | 2008-06-30 14:58:37 | 

| 67 | 小坏蛋   |  52 | 表里不一                   | 2008-06-30 14:58:37 | 

| 68 | 上帝他爷 |  96 | 非常英俊                   | 2008-06-30 14:58:37 | 

| 69 | MM来了   |  10 | 。。。                     | 2008-06-30 14:58:37 | 

| 70 | 歌颂党   |  20 | 社会主义好                 | 2008-06-30 14:58:37 | 

| 71 | 人民好   |  20 | 的确是好                   | 2008-06-30 14:58:37 | 

| 72 | 老高     |  10 | 学习很好                   | 2008-06-30 14:58:37 | 

| 73 | 斜三     |  60 | 眼睛斜了                   | 2008-06-30 14:58:37 | 

| 74 | 中华之子 | 100 | 威武的不行了               | 2008-06-30 14:58:37 | 

| 75 | 大米     |  63 | 我爱吃                     | 2008-06-30 14:58:37 | 

| 76 | 苹果     |  15 | 好吃                       | 2008-06-30 14:58:37 | 

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

19 rows in set (0.00 sec)

现在是达到了目的了,为啥中途要干掉唯一索引呢?因为set 语法 再有IGNORE 的时候会忽略掉。

©著作权归作者所有:来自51CTO博客作者david_yeung的原创作品,如需转载,请注明出处,否则将追究法律责任

mysqldata休闲MySQL备份与恢复


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP