`

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

阅读更多

我在CU写的,现在搬过来。CSDN的博客格式终于好了!

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 的时候会忽略掉。

分享到:
评论

相关推荐

    mysql Load Data InFile 的用法

    `LOAD DATA INFILE` 是 MySQL 数据库中一种高效的数据导入工具,它允许用户从外部文本文件快速批量导入数据到数据库的表中。相比于使用 `INSERT INTO` 语句逐条插入,`LOAD DATA INFILE` 在处理大量数据时速度显著更...

    mysql中Load Data记录换行问题的解决方法

    在MySQL中,`LOAD DATA INFILE` 是一个非常高效的命令,用于从文本文件批量导入数据到数据库表中。然而,在处理包含Windows风格换行符(`\r\n`)的文件时,可能会遇到一些问题,就像在标题和描述中提到的记录换行...

    txt数据文件导入mysql数据库

    首先,我们来看`LOAD DATA INFILE`语句。这是MySQL提供的一种高效的数据导入工具,用于快速地从文本文件(如CSV、TXT等)中批量加载数据到已存在的表中。标题"txt数据文件导入mysql数据库"就是指的这个功能。使用...

    MySql示例9:表数据的导出和导入.zip

    在这个过程中,确保源文件与目标表的字段类型和顺序匹配,否则可能需要在`LOAD DATA INFILE`语句中指定字段映射。 对于大型数据集,导出和导入过程可能需要考虑性能优化,例如分批导入、设置合适的缓冲区大小等。...

    DataWarehousing

    2. **数据加载**:使用INSERT INTO语句将数据加载到表中,或者使用LOAD DATA INFILE命令快速导入大量数据。 3. **数据转换**:使用SQL的聚合函数(如COUNT, SUM, AVG)、分组(GROUP BY)、连接(JOIN)和窗口函数...

    mysql命令行导入导出

    首先,我们来看如何导出数据。MySQL提供了`mysqldump`命令来实现这一功能。例如,要导出名为`mydatabase`的数据库,你可以使用以下命令: ```bash mysqldump -u your_username -p your_password mydatabase > ...

    MySQL数据导入导出

    而如果只关注数据的快速导入导出,特别是当操作的表结构已经存在或者不需要备份时,使用 SELECT INTO OUTFILE 和 LOAD DATA INFILE 可能会更高效。 此外,MySQL的权限系统对于数据导入导出操作同样重要。数据库管理...

    中国省市区地区数据库

    在MySQL中导入这些数据时,需要先创建对应的表格结构,然后使用`LOAD DATA INFILE`或`source`命令将SQL文件中的数据加载到数据库中。例如: ```sql CREATE TABLE province ( id INT PRIMARY KEY, name VARCHAR(50...

    各种数据库导出XML导入oracle方式.doc

    Sybase数据库的处理方式与MySQL类似,使用`load data infile`命令,但需要注意的是,字段定义可能会根据不同的数据库方言有所不同,例如在Sybase中,字段NBXH和QYMC被定义在`<column name="...">`标记内。...

    MySQL导入csv、excel或者sql文件的小技巧

    首先,我们来看导入CSV文件的方法。使用`LOAD DATA INFILE`命令可以方便地将CSV数据加载到已存在的表中。例如: ```sql mysql> LOAD DATA INFILE "your csv file path" INTO TABLE [tablename] FIELDS TERMINATED ...

    MySQL用作备份还原的导入和导出命令用法整理

    接着,让我们来看看如何使用mysqldump命令导出数据库结构或不含数据的数据库。如果需要仅导出数据库结构,可以在命令中加入-d参数,并使用--add-drop-table参数在每个create table语句之前增加一个drop table语句。...

    mysql表添加测试数据函数

    - **使用`LOAD DATA INFILE`**:如果数据可以从文件中批量加载,则可以使用`LOAD DATA INFILE`命令,这是一种非常高效的数据导入方式。 - **调整MySQL配置**:合理地调整MySQL服务器的配置参数,如增加`innodb_...

    MySQL 命令大全

    首先,我们来看如何启动和停止MySQL服务。通过运行`net stop mysql`命令可以停止MySQL服务,而`net start mysql`则用于启动服务。这是在Windows系统中进行操作的常用方法,确保数据库系统的正常运行。 接下来,了解...

    Sql Loader 在C#的应用实例

    INFILE 'N.txt' INTO TABLE my_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( column1, column2, ... ) ``` 在这个例子中,`N.txt` 是数据文件,每行数据由逗号分隔,字段...

    matlab中如何读取TXT数据文件.pdf

    首先,让我们看看如何使用基本的MATLAB函数`fgetl`来读取特定行的数据。以下是一个函数示例,它读取`filein`文件中的第`line`行,并将其写入`fileout`文件: ```matlab function dataout=dataread(filein,fileout,...

    Mysql数据库导入命令Source详解.pdf

    首先,我们来看`mysqldump`,这是一个用于备份MySQL数据库的命令行工具。它可以导出整个数据库或单个表的数据及结构,方便进行数据迁移或备份。以下是几个基本用例: 1. **导出整个数据库**: ```bash mysqldump ...

    Mysql——操作命令使用

    首先,我们来看如何使用`SHOW`语句。`SHOW DATABASES;`这个命令用于列出服务器上现有的所有数据库。你可以通过执行此命令来查看有哪些数据库存在于系统中。 接下来是创建数据库,如创建名为`MYSQLDATA`的数据库,...

    把excel表格里的数据导入sql数据库的两种方法

    首先,我们来看第一种方法,即利用MySQL for Excel插件。这个插件允许用户直接在Excel环境中操作MySQL数据库,简化了数据导入的过程。安装插件后,用户可以在Excel中编辑数据,并像处理Excel工作表一样更新数据库。...

    MYSQL导入导出命令详解

    /usr/local/mysql/bin/mysql -uroot -proot test -e “LOAD DATA INFILE ‘/usr/1.txt’ replace INTO TABLE test FIELDS TERMINATED BY ‘\t’ (name,address)” info: 1.txt zhangsan wuhan lishi wuhan 把1.txt...

Global site tag (gtag.js) - Google Analytics