1. 程式人生 > >mysql中的load data infile用法

mysql中的load data infile用法

http://blog.csdn.net/adparking/article/details/7098221

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語句從一個文字檔案中以很高的速度讀入一個表中。如果指定LOCAL關鍵詞,從客戶主機讀檔案。如果LOCAL沒指定,檔案必須位於伺服器上。(LOCAL在MySQL3.22.6或以後版本中可用。)

為了安全原因,當讀取位於伺服器上的文字檔案時,檔案必須處於資料庫目錄或可被所有人讀取。另外,為了對伺服器上檔案使用LOAD DATA INFILE,在伺服器主機上你必須有file的許可權。見6.5 由MySQL提供的許可權。

如果你指定關鍵詞LOW_PRIORITY,LOAD DATA語句的執行被推遲到沒有其他客戶讀取表後。

使用LOCAL將比讓伺服器直接存取檔案慢些,因為檔案的內容必須從客戶主機傳送到伺服器主機。在另一方面,你不需要file許可權裝載本地檔案。

你也可以使用mysqlimport實用程式裝載資料檔案;它由傳送一個LOAD DATA INFILE命令到伺服器來運作。 --local選項使得mysqlimport從客戶主機上讀取資料。如果客戶和伺服器支援壓縮協議,你能指定--compress在較慢的網路上獲得更好的效能。

當在伺服器主機上尋找檔案時,伺服器使用下列規則:

如果給出一個絕對路徑名,伺服器使用該路徑名。
如果給出一個有一個或多個前置部件的相對路徑名,伺服器相對伺服器的資料目錄搜尋檔案。
如果給出一個沒有前置部件的一個檔名,伺服器在當前資料庫的資料庫目錄尋找檔案。
注意這些規則意味著一個像“./myfile.txt”給出的檔案是從伺服器的資料目錄讀取,而作為“myfile.txt”給出的一個檔案是從當前資料庫的資料庫目錄下讀取。也要注意,對於下列哪些語句,對db1檔案從資料庫目錄讀取,而不是db2:

mysql> USE db1;
mysql> LOAD DATA INFILE "./data.txt" INTO TABLE db2.my_table;

REPLACE和IGNORE關鍵詞控制對現有的唯一鍵記錄的重複的處理。如果你指定REPLACE,新行將代替有相同的唯一鍵值的現有行。如果你指定IGNORE,跳過有唯一鍵的現有行的重複行的輸入。如果你不指定任何一個選項,當找到重複鍵鍵時,出現一個錯誤,並且文字檔案的餘下部分被忽略時。

如果你使用LOCAL關鍵詞從一個本地檔案裝載資料,伺服器沒有辦法在操作的當中停止檔案的傳輸,因此預設的行為好像IGNORE被指定一樣。

LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,
SELECT句法。為了將一個數據庫的資料寫入一個檔案,使用SELECT ... INTO OUTFILE,為了將檔案讀回資料庫,使用LOAD DATA INFILE。兩個命令的FIELDS和LINES子句的語法是相同的。兩個子句是可選的,但是如果指定兩個,FIELDS必須在LINES之前。

如果你指定一個FIELDS子句,它的每一個子句(TERMINATED BY, [OPTIONALLY] ENCLOSED BY和ESCAPED BY)也是可選的,除了你必須至少指定他們之一。

如果你不指定一個FIELDS子句,預設值與如果你這樣寫的相同:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'

如果你不指定一個LINES子句,預設值與如果你這樣寫的相同:

LINES TERMINATED BY '\n'
換句話說,預設值導致讀取輸入時,LOAD DATA INFILE表現如下:

在換行符處尋找行邊界
在定位符處將行分進欄位
不要期望欄位由任何引號字元封裝
將由“\”開頭的定位符、換行符或“\”解釋是欄位值的部分字面字元
相反,預設值導致在寫入輸出時,SELECT ... INTO OUTFILE表現如下:

在欄位之間寫定位符
不用任何引號字元封裝欄位
使用“\”轉義出現在欄位中的定位符、換行符或“\”字元
在行尾處寫換行符
注意,為了寫入FIELDS ESCAPED BY '\\',對作為一條單個的反斜線被讀取的值,你必須指定2條反斜線值。

IGNORE number LINES選項可被用來忽略在檔案開始的一個列名字的頭:

mysql> LOAD DATA INFILE "/tmp/file_name" into table test IGNORE 1 LINES;

當你與LOAD DATA INFILE一起使用SELECT ... INTO OUTFILE將一個數據庫的資料寫進一個檔案並且隨後馬上將檔案讀回資料庫時,兩個命令的欄位和處理選項必須匹配,否則,LOAD DATA INFILE將不能正確解釋檔案的內容。假定你使用SELECT ... INTO OUTFILE將由逗號分隔的欄位寫入一個檔案:

mysql> SELECT * FROM table1 INTO OUTFILE 'data.txt'
           FIELDS TERMINATED BY ','
           FROM ...

為了將由逗號分隔的檔案讀回來,正確的語句將是:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
           FIELDS TERMINATED BY ',';

相反,如果你試圖用下面顯示的語句讀取檔案,它不會工作,因為它命令LOAD DATA INFILE在欄位之間尋找定位符:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
           FIELDS TERMINATED BY '\t';

可能的結果是每個輸入行將被解釋為單個的欄位。

LOAD DATA INFILE能被用來讀取從外部來源獲得的檔案。例如,以dBASE格式的檔案將有由逗號分隔並用雙引號包圍的欄位。如果檔案中的行由換行符終止,下面顯示的命令說明你將用來裝載檔案的欄位和行處理選項:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
           FIELDS TERMINATED BY ',' ENCLOSED BY '"'
           LINES TERMINATED BY '\n';

任何欄位或行處理選項可以指定一個空字串('')。如果不是空,FIELDS [OPTIONALLY] ENCLOSED BY和FIELDS ESCAPED BY值必須是一個單個字元。FIELDS TERMINATED BY和LINES TERMINATED BY值可以是超過一個字元。例如,寫入由回車換行符對(CR+LF)終止的行,或讀取包含這樣行的一個檔案,指定一個LINES TERMINATED BY '\r\n'子句。

FIELDS [OPTIONALLY] ENCLOSED BY控制欄位的包圍字元。對於輸出(SELECT ... INTO OUTFILE),如果你省略OPTIONALLY,所有的欄位由ENCLOSED BY字元包圍。對於這樣的輸出的一個例子(使用一個逗號作為欄位分隔符)顯示在下面:

"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"

如果你指定OPTIONALLY,ENCLOSED BY字元僅被用於包圍CHAR和VARCHAR欄位:

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20

注意,一個欄位值中的ENCLOSED BY字元的出現通過用ESCAPED BY字元作為其字首來轉義。也要注意,如果你指定一個空ESCAPED BY值,可能產生不能被LOAD DATA INFILE正確讀出的輸出。例如,如果轉義字元為空,上面顯示的輸出顯示如下。注意到在第四行的第二個欄位包含跟隨引號的一個逗號,它(錯誤地)好象要終止欄位:

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20

對於輸入,ENCLOSED BY字元如果存在,它從欄位值的尾部被剝去。(不管是否指定OPTIONALLY都是這樣;OPTIONALLY對於輸入解釋不起作用)由ENCLOSED BY字元領先的ESCAPED BY字元出現被解釋為當前欄位值的一部分。另外,出現在欄位中重複的ENCLOSED BY被解釋為單個ENCLOSED BY字元,如果欄位本身以該字元開始。例如,如果ENCLOSED BY '"'被指定,引號如下處理:

"The ""BIG"" boss" -> The "BIG" boss
The "BIG" boss      -> The "BIG" boss
The ""BIG"" boss    -> The ""BIG"" boss

FIELDS ESCAPED BY控制如何寫入或讀出特殊字元。如果FIELDS ESCAPED BY字元不是空的,它被用於字首在輸出上的下列字元:

FIELDS ESCAPED BY字元
FIELDS [OPTIONALLY] ENCLOSED BY字元
FIELDS TERMINATED BY和LINES TERMINATED BY值的第一個字元
ASCII 0(實際上將後續轉義字元寫成 ASCII'0',而不是一個零值位元組)
如果FIELDS ESCAPED BY字元是空的,沒有字元被轉義。指定一個空轉義字元可能不是一個好主意,特別是如果在你資料中的欄位值包含剛才給出的表中的任何字元。

對於輸入,如果FIELDS ESCAPED BY字元不是空的,該字元的出現被剝去並且後續字元在字面上作為欄位值的一個部分。例外是一個轉義的“0”或“N”(即,\0或\N,如果轉義字元是“\”)。這些序列被解釋為ASCII 0(一個零值位元組)和NULL。見下面關於NULL處理的規則。

對於更多關於“\”- 轉義句法的資訊,在某些情況下,欄位和行處理選項相互作用:

如果LINES TERMINATED BY是一個空字串並且FIELDS TERMINATED BY是非空的,行也用FIELDS TERMINATED BY終止。
如果FIELDS TERMINATED BY和FIELDS ENCLOSED BY值都是空的(''),一個固定行(非限定的)格式被使用。用固定行格式,在欄位之間不使用分隔符。相反,列值只用列的“顯示”寬度被寫入和讀出。例如,如果列被宣告為INT(7),列的值使用7個字元的欄位被寫入。對於輸入,列值通過讀取7個字元獲得。固定行格式也影響NULL值的處理;見下面。注意如果你正在使用一個多位元組字符集,固定長度格式將不工作。
NULL值的處理有多種,取決於你使用的FIELDS和LINES選項:

對於預設FIELDS和LINES值,對輸出,NULL被寫成\N,對輸入,\N被作為NULL讀入(假定ESCAPED BY字元是“\”)。
如果FIELDS ENCLOSED BY不是空的,包含以文字詞的NULL作為它的值的欄位作為一個NULL值被讀入(這不同於包圍在FIELDS ENCLOSED BY字元中的字NULL,它作為字串'NULL'讀入)。
如果FIELDS ESCAPED BY是空的,NULL作為字NULL被寫入。
用固定行格式(它發生在FIELDS TERMINATED BY和FIELDS ENCLOSED BY都是空的時候),NULL作為一個空字串被寫入。注意,在寫入檔案時,這導致NULL和空字串在表中不能區分,因為他們都作為空字串被寫入。如果在讀迴文件時需要能區分這兩者,你應該不使用固定行格式。
一些不被LOAD DATA INFILE支援的情況:

固定長度的行(FIELDS TERMINATED BY和FIELDS ENCLOSED BY都為空)和BLOB或TEXT列。
如果你指定一個分隔符與另一個相同,或是另一個的字首,LOAD DATA INFILE不能正確地解釋輸入。例如,下列FIELDS子句將導致問題:
FIELDS TERMINATED BY '"' ENCLOSED BY '"'

如果FIELDS ESCAPED BY是空的,一個包含跟隨FIELDS TERMINATED BY值之後的FIELDS ENCLOSED BY或LINES TERMINATED BY的欄位值將使得LOAD DATA INFILE過早地終止讀取一個欄位或行。這是因為LOAD DATA INFILE不能正確地決定欄位或行值在哪兒結束。
下列例子裝載所有persondata表的行:

mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

沒有指定欄位表,所以LOAD DATA INFILE期望輸入行對每個表列包含一個欄位。使用預設FIELDS和LINES值。

如果你希望僅僅裝載一張表的某些列,指定一個欄位表:

mysql> LOAD DATA INFILE 'persondata.txt'
           INTO TABLE persondata (col1,col2,...);

如果在輸入檔案中的欄位順序不同於表中列的順序,你也必須指定一個欄位表。否則,MySQL不能知道如何匹配輸入欄位和表中的列。

如果一個行有很少的欄位,對於不存在輸入欄位的列被設定為預設值。

如果欄位值預設,空欄位值有不同的解釋:

對於字串型別,列被設定為空字串。
對於數字型別,列被設定為0。
對於日期和時間型別,列被設定為該型別的適當“零”值。
如果列有一個NULL,或(只對第一個TIMESTAMP列)在指定一個欄位表時,如果TIMESTAMP列從欄位表省掉,TIMESTAMP列只被設定為當前的日期和時間。

如果輸入行有太多的欄位,多餘的欄位被忽略並且警告數字加1。

LOAD DATA INFILE認為所有的輸入是字串,因此你不能像你能用INSERT語句的ENUM或SET列的方式使用數字值。所有的ENUM和SET值必須作為字串被指定!

如果你正在使用C API,當LOAD DATA INFILE查詢完成時,你可通過呼叫API函式mysql_info()得到有關查詢的資訊。資訊字串的格式顯示在下面:

Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
當值通過INSERT語句插入時,在某些情況下出現警告,除了在輸入行中有太少或太多的欄位時,LOAD DATA INFILE也產生警告。警告沒被儲存在任何地方;警告數字僅能用於表明一切是否順利。如果你得到警告並且想要確切知道你為什麼得到他們,一個方法是使用SELECT ... INTO OUTFILE到另外一個檔案並且把它與你的原版輸入檔案比較。