1. 程式人生 > >mysql的load data,高速將文本文件,插入數據庫中

mysql的load data,高速將文本文件,插入數據庫中

option 子句 取數據 跳過 expr 數據導入 文件名 所在 from

1語法


LOAD DATA [ LOW_PRIORITY | CONCURRENT ] [ LOCAL ] INFILE ‘file_name.txt‘

[ REPLACE | IGNORE ]

INTO TABLE tbl_name

[ FIELDS

[ TERMINATED BY ‘string‘ ]

[ [OPTIONALLY] ENCLOSED BY ‘char‘ ]

[ ESCAPED BY ‘char‘ ]

]

[ LINES

[ STARTING BY ‘string‘ ]

[ TERMINATED BY ‘string‘ ]

]

[ IGNORE number LINES ]

[ (col_name_or_user_var,...) ]

[ SET col_name = expr,...] ]

關鍵字解釋

LOAD DATA [ LOW_PRIORITY | CONCURRENT ] [ LOCAL ] INFILE ‘file_name.txt‘

[ REPLACE | IGNORE ]

INTO TABLE tbl_name

1LOW_PRIORITY: 加載數據被延遲,直道沒有其他客戶端從表中讀取為止
CONCURRENT: 當加載的數據正在進行的時,如果有用戶請求則開啟新的線程來獲取數據

2如果指定了LOCAL 關鍵字,它將對連接的客戶端做出解釋:

? 如果指定了LOCAL,客戶端主機上的客戶端組件讀取文件並發送到服務器。可以給出文件的完整路徑以確定其精確位置。如果給出的是相對路徑,則文件名是相對於客戶端組件啟動時所在的目錄。
? 如果沒有指定LOCAL,文件是位於服務器的主機上,並且直接被服務器讀取。
當從服務器主機定位文件時,服務器使用下列規則:
? 如果給定完整的路徑,服務器使用該路徑名。
? 如果給定一個或多個前置構件的相對路徑,服務器以相對服務器的數據目錄搜索文件。
? 如果給定沒有前置構件的文件名,服務器從當前數據庫的數據庫目錄搜尋文件。

3REPLACE 和IGNORE 關鍵字處理那些與已存在的主鍵值重復的輸入記錄
如果指定了REPLACE,輸入行將會代替已存在的行(也就是說,主索引值相同的行將作為存在的行)。參考REPLACE 語法 。
如果指定了IGNORE,與已存在行主鍵值重復的輸入行將被跳過。如果不指定二者中的任一個,則操作行為將依賴是否指定了LOCAL關鍵字。
沒有指定LOCAL,則如果發現有重復的鍵值,將產生一個錯誤,並忽略文本文件的其余部分。
如果指定了LOCAL,則缺省的操作行為將與指定了IGNORE 的相同;這是因為,在操作過程中,服務器沒有辦法終止文件的傳送。

[ FIELDS

[ TERMINATED BY ‘string‘ ]

[ [OPTIONALLY] ENCLOSED BY ‘char‘ ] //enclosed by描述的是字段的括起字符。

[ ESCAPED BY ‘char‘ ] //escaped by描述的轉義字符。默認的是反斜杠 (backslash:\ )

]
[ LINES

[ STARTING BY ‘string‘ ]

[ TERMINATED BY ‘string‘ ]

]
4
數據格式:
"中華之子","100","威武的不行了"
"大米","63","我愛吃"
"蘋果","15","好吃"
load data infile ‘D:/aa.txt‘ ignore into table 表名 character set gbk fields terminated by ‘,‘ enclosed by ‘"‘ lines terminated by ‘\r\n‘ (表中的字段1,表中的字段2,表中的字段3);
terminated by ‘,‘ 用什麽風格字符
enclosed by ‘"‘ 字符用什麽包起來的
lines terminated by ‘\r\n‘ 行的末尾換行符是什麽(liunx改為\n)


[ IGNORE number LINES ]

[ (col_name_or_user_var,...) ]

[ SET col_name = expr,...] ]

5IGNORE number LINES選項可被用來忽略在文件的某一行

假設數據文件如下:

Book1.csv

編號,名稱,說明
1,測試數據1,"測試CSV文件中,有逗號"
2,測試數據2,"測試CSV文件中有""雙引號"""
3,測試數據3,"測試CSV文件中,有逗號和""雙引號"""
4,測試數據4,普通數據

mysql> CREATE TABLE Test_Book1 (
-> id int,
-> name VARCHAR(10),
-> data VARCHAR(100)
-> );
Query OK, 0 rows affected (0.05 sec)


下面的 lines terminated by ‘\r\n‘ 是 要求換行符號,為 windows的換行
下面的 ignore 1 lines是 忽略第一行的標題行。
mysql> LOAD DATA INFILE ‘f:/Book1.csv‘
-> INTO TABLE Test_Book1
-> FIELDS TERMINATED BY ‘,‘
-> OPTIONALLY ENCLOSED BY ‘"‘
-> lines terminated by ‘\r\n‘
-> ignore 1 lines
-> (id, name, data);

mysql> select * from test_book1;
+------+-----------+--------------------------------+
| id | name | data |
+------+-----------+--------------------------------+
| 1 | 測試數據1 | 測試CSV文件中,有逗號 |
| 2 | 測試數據2 | 測試CSV文件中有"雙引號" |
| 3 | 測試數據3 | 測試CSV文件中,有逗號和"雙引號" |
| 4 | 測試數據4 | 普通數據 |
+------+-----------+--------------------------------+

ignore 1 lines 忽略第一行的標題行。

[email protected]

/* */
假設數據文件如下:

Book1.csv


1,測試數據1,"測試CSV文件中,有逗號"
2,測試數據2,"測試CSV文件中有""雙引號"""
3,測試數據3,"測試CSV文件中,有逗號和""雙引號"""
4,測試數據4,普通數據

mysql> CREATE TABLE Test_Book1 (
-> id int,
-> name VARCHAR(10),
-> data VARCHAR(100)
-> );
Query OK, 0 rows affected (0.05 sec)
我只需要第一,二列的數據的時候
mysql> LOAD DATA INFILE ‘f:/test_main.txt‘
-> INTO TABLE test_main6
-> FIELDS TERMINATED BY ‘,‘
-> OPTIONALLY ENCLOSED BY ‘‘‘‘
-> (id,name, @dummy);

mysql> select * from test_book1;
+------+-----------+--------------------------------+
| id | name | data |
+------+-----------+--------------------------------+
| 1 | 測試數據1 | |
| 2 | 測試數據2 | |
| 3 | 測試數據3 | |
| 4 | 測試數據4 | |
+------+-----------+--------------------------------+

這裏的關鍵點, 在於那個 @dummy。
對你而言, 如果文件有 10列, 你只導 2 , 7 的話, 那就是
@dummy,列2,@dummy,@dummy,@dummy,@dummy,列7,@dummy,@dummy,@dummy

7set子句
SET 子句可以提供不是來源於輸入文件的值。下面的語句將column3 設置為當前的日期和時間:
LOAD DATA INFILE ‘file.txt‘
INTO TABLE t1
(column1, column2)
SET column3 = CURRENT_TIMESTAMP;
可以讓某一列的值參與一些操作
LOAD DATA INFILE ‘file.txt‘
INTO TABLE t1
(column1, @var1)
SET column2 = @var1/100;
也可以讓前後列的數據產生關系(假設第一列是一個日期格式的數據,我的第三列可以根據第一列的日期計算出星期信息然後存入數據庫)
LOAD DATA INFILE ‘file.txt‘
INTO TABLE t1
(column1, column2)
SET column3 = SET name=CASE WHEN DATE_FORMAT(date,‘%w‘) =1 THEN "星期一"
WHEN DATE_FORMAT(date,‘%w‘) =2 THEN "星期二"
end;

使用列/變量列表和SET子句要受到一下限制:
? SET 子句中的賦值列名應當只能在賦值操作符的左邊。
? 在SET 賦值語句中,可以使用子查詢。此查詢返回一個將被賦予列的值,它可能僅僅是一個標量查詢。不能用子查詢去查詢將被導入的表。
? 對於列/變量列表或SET 子句,由於使用IGNORE 子句而被忽略的行就不會被處理。
? 由於用戶變量沒有顯示寬度,當導入的數據是行固定格式時,將不能使用用戶變量。

8設置存入時候使用的字符

gbk utf8

load data infile ‘C:\\Users\\edgewalk\\Desktop\\test.txt‘ ignore into table test character set gbk fields terminated by ‘,‘
lines terminated by ‘\n‘ (
date,
money,
desctipt
)

2使用load data infile導入導出備份數據

如果要導出一個表中的部分字段或者部分符合條件的記錄,需要用到了mysql的into outfile 和 load data infile 。 例如下面的mysql命令是把select的mytable表中的數據導出到C:\\Users\\7q\\Desktop\\test1.txt。
select * from test into outfile ‘C:\\Users\\7q\\Desktop\\test1.txt‘ fields terminated by ‘,‘ lines terminated by ‘\r\n‘ ;

假如要導入剛才備份的數據,可以使用load file方法,例如下面的mysql命令,把導出的數據導入了mytable_bak的表中:
load data infile ‘C:\\Users\\7q\\Desktop\\test1.txt‘ into table mytable_bak fields terminated by ‘,‘ lines terminated by ‘\r\n‘;
這種方法的好處是,導出的數據可以自己規定格式,並且導出的是純數據,不存在建表信息,你可以直接導入另外一個同數據庫的不同表中.

mysql的load data,高速將文本文件,插入數據庫中