mysql導入數據load data infile用法

MySQL高效導入數據的方法,load data infile;mysql

基本語法:
  load data  [low_priority] [local] infile 'file_name txt' [replace | ignore]
  into table tbl_name
  fields
  [terminated by't']
  [OPTIONALLY] enclosed by '']
  [escaped by'\' ]]
  [lines terminated by'n']
  [ignore number lines]
  [(col_name,   )]
 
load data infile語句從一個文本文件中以很高的速度讀入一個表中。使用這個命令以前,mysqld進程(服務)必須已經在運行。因爲安全緣由,當讀取位於服務器上的文件時,文件必須處於數據庫目錄或可被全部人讀取。另外,爲了對服務器上文件使用load data infile,在服務器主機上必須有file的權限。
 
一、若是你指定關鍵詞low_priority,那麼MySQL將會等到沒有其餘人讀這個表的時候,才把數據插入。可使用以下的命令: 
  load data  low_priority infile "/home/mark/data sql" into table Orders;
 
二、若是指定local關鍵詞,則代表從客戶主機讀文件。若是local沒指定,文件必須位於服務器上。
 
三、replace和ignore關鍵詞控制對現有的惟一鍵記錄的重複的處理。若是你指定replace,新行將代替有相同的惟一鍵值的現有行。若是你指定ignore,跳過有惟一鍵的現有行的重複行的輸入。若是你不指定任何一個選項,當找到重複鍵時,出現一個錯誤,而且文本文件的餘下部分被忽略。例如:
  load data  low_priority infile "/home/mark/data sql" replace into table Orders;
 
四、分隔符
(1) fields關鍵字指定了文件字段的分割格式,若是用到這個關鍵字,MySQL剖析器但願看到至少有下面的一個選項: 
    terminated by分隔符:意思是以什麼字符做爲分隔符
    enclosed by字段括起字符
    escaped by轉義字符
    terminated by描述字段的分隔符,默認狀況下是tab字符(\t) 
    enclosed by描述的是字段的括起字符。
    escaped by描述的轉義字符。默認的是反斜槓(backslash:\ )  
   例如:load data infile "/home/mark/Orders txt" replace into table Orders fields terminated by',' enclosed by '"';
 
(2)lines 關鍵字指定了每條記錄的分隔符默認爲'\n'即爲換行符
  若是兩個字段都指定了,那fields必須在lines以前。若是不指定fields關鍵字,缺省值與這樣寫相同: fields terminated by'\t' enclosed by ’ '' ‘ escaped by'\\'
  若是你不指定一個lines子句,缺省值與這樣寫的相同: lines terminated by'\n'
  例如:load data infile "/jiaoben/load.txt" replace into table test fields terminated by ',' lines terminated by '/n';
 
五、 load data infile 能夠按指定的列把文件導入到數據庫中。 當咱們要把數據的一部份內容導入的時候,,須要加入一些欄目(列/字段/field)到MySQL數據庫中,以適應一些額外的須要。好比,咱們要從Access數據庫升級到MySQL數據庫的時候,
下面的例子顯示瞭如何向指定的欄目(field)中導入數據: 
  load data infile "/home/Order txt" into table Orders(Order_Number, Order_Date, Customer_ID);
 
六、當在服務器主機上尋找文件時,服務器使用下列規則: 
(1)若是給出一個絕對路徑名,服務器使用該路徑名。 
(2)若是給出一個有一個或多個前置部件的相對路徑名,服務器相對服務器的數據目錄搜索文件。  
(3)若是給出一個沒有前置部件的一個文件名,服務器在當前數據庫的數據庫目錄尋找文件。 
例如: /myfile txt」給出的文件是從服務器的數據目錄讀取,而做爲「myfile txt」給出的一個文件是從當前數據庫的數據庫目錄下讀取。
 
 
注意:字段中的空值用 \N 表示


LOAD DATA INFILE 一直被認爲是MySQL很強大的一個數據導入工具,由於他速度很是的快。
不過有幾個問題必定要注意:
一、編碼。
二、靈活導入導出。

舉兩個例子說明一下:
1、關於編碼
咱們的示例文本文件:
"我愛你","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`);

這些也就是具體的表屬性了,指明這個就能夠導入想要的數據。sql


二、關於靈活性,其實也就是一個記錄功能
若是想在導入的時候記錄一下導入的具體時間怎麼辦?
咱們來看看
先加一個時間屬性記錄導入時間。
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 的時候會忽略掉。數據庫

相關文章
相關標籤/搜索