top
Loading...
13.2.5.LOADDATAINFILE語法
13.2.5. LOAD DATA INFILE語法
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 INFILE語句用于高速地從一個文本文件中讀取行,并裝入一個表中。文件名稱必須為一個文字字符串。

要了解有關INSERTLOAD DATA INFILE的效率的對比和有關LOAD DATA INFILE加速的更多信息,請參見7.2.16節,“INSERT語句的速度”。

character_set_database系統變量指示的字符集被用于解釋文件中的信息。SET NAMEScharacter_set_client的設置不會影響對輸入的解釋。

注意,目前不能載入UCS2數據文件。

您也可以通過使用mysqlimport應用程序載入數據文件;通過向服務器發送一個LOAD DATA INFILE語句實現此功能。--local選項用于使mysqlimport從客戶主機中讀取數據文件。如果客戶端和服務器支持壓縮協議,則您可以指定—compress選項提高在慢速網絡中的性能。請參見8.10節,“mysqlimport:數據導入程序。

如果您使用LOW_PRIORITY,則LOAD DATA語句的執行被延遲,直到沒有其它的客戶端從表中讀取為止。

如果一個MyISAM表滿足同時插入的條件(即該表在中間有空閑塊),并且您對這個MyISAM表指定了CONCURRENT,則當LOAD DATA正在執行時,其它線程會從表中重新獲取數據。即使沒有其它線程在同時使用本表格,使用本選項也會略微影響LOAD DATA的性能。

如果指定了LOCAL,則被認為與連接的客戶端有關:

·         如果指定了LOCAL,則文件會被客戶主機上的客戶端讀取,并被發送到服務器。文件會被給予一個完整的路徑名稱,以指定確切的位置。如果給定的是一個相對的路徑名稱,則此名稱會被理解為相對于啟動客戶端時所在的目錄。

·         如果LOCAL沒有被指定,則文件必須位于服務器主機上,并且被服務器直接讀取。

當在服務器主機上為文件定位時,服務器使用以下規則:

·         如果給定了一個絕對的路徑名稱,則服務器使用此路徑名稱。

·         如果給定了帶有一個或多個引導組件的相對路徑名稱,則服務器會搜索相對于服務器數據目錄的文件。

·         如果給定了一個不帶引導組件的文件名稱,則服務器會在默認數據庫的數據庫目錄中尋找文件。

注意,這些規則意味著名為./myfile.txt的文件會從服務器數據目錄中被讀取,而名為myfile.txt的同樣的文件會從默認數據庫的數據庫目錄中讀取。例如,下面的LOAD DATA語句會從db1數據庫目錄中讀取文件data.txt,因為db1是當前數據庫。即使語句明確把文件載入到db2數據庫中的表里,也會從db1目錄中讀取。

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

注意,使用正斜杠指定Windows路徑名稱,而不是使用反斜杠。如果您使用反斜杠,您必須使用兩個。

出于安全原因,當讀取位于服務器中的文本文件時,文件必須位于數據庫目錄中,或者是全體可讀的。另外,要對服務器文件使用LOAD DATA INFILE,您必須擁有FILE權限。

見5.7.3節,“MySQL提供的權限”。

與讓服務器直接讀取文件相比,使用LOCAL速度略慢,這是因為文件的內容必須通過客戶端發送到服務器上。不過,您不需要FILE權限來載入本地文件。

只有當您的服務器和您的客戶端都許可時,LOCAL才可運行。例如,如果使用—local-infile=0啟動mysqld,則LOCAL不運行。請參見5.6.4節,“LOAD DATA LOCAL安全問題”。

如果您需要LOAD DATA來從一個管道中讀取,您可以使用以下方法(此處我們把/目錄清單載入一個表格):

mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
find / -ls > /mysql/db/x/x
mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x

有些輸入記錄把原有的記錄復制到唯一關鍵字值上。REPLACEIGNORE關鍵字用于控制這些輸入記錄的操作。

如果您指定了REPLACE,則輸入行會替換原有行(換句話說,與原有行一樣,對一個主索引或唯一索引具有相同值的行)。請參見13.2.6節,“REPLACE語法”。

如果您指定IGNORE,則把原有行復制到唯一關鍵字值的輸入行被跳過。如果您這兩個選項都不指定,則運行情況根據LOCAL關鍵詞是否被指定而定。不使用LOCAL時,當出現重復關鍵字值時,會發生錯誤,并且剩下的文本文件被忽略。使用LOCAL時,默認的運行情況和IGNORE被指定時的情況相同;這是因為在運行中間,服務器沒有辦法中止文件的傳輸。

如果您希望在載入運行過程中忽略外鍵的限制,您可以在執行LOAD DATA前發送一個SET FOREIGN_KEY_CHECKS=0語句。

如果您對一個空的MyISAM表使用LOAD DATA INFILE,則所有的非唯一索引會被創建在一個獨立批中(對于REPAIR TABLE)。當您有許多索引時,這通常會使LOAD DATA INFILE大大加快。通常,LOAD DATA INFILE的速度會非常快,但是在某些極端情況下,您可以在把文件載入到表中之前使用ALTER TABLE...DISABLE KEYS關閉LOAD DATA INFILE,或者在載入文件之后使用ALTER TABLE...ENABLE KEYS再次創建索引,使創建索引的速度更快。請參見7.2.16節,“INSERT語句的速度”。

LOAD DATA INFILESELECT...INTO OUTFILE的補語。(見13.2.7節,“SELECT語法”。)要從一個表中把數據寫入一個文件中,應使用SELECT...INTO OUTFILE。要讀取文件,放回到表中,應使用LOAD DATA INFILEFIELDSLINES子句的語法對于兩個語句是一樣的。兩個子句都是自選的,但是如果兩個都被指定了,FIELDS必須位于LINES的前面。

如果您指定了一個FIELDS子句,則每個亞子句(TERMINATED BY, [OPTIONALLY] ENCLOSED BYESCAPED BY)也是自選的。不過,您必須指定其中至少一個。

如果您不指定FIELDS子句,則默認值為假設您寫下如下語句時的值:

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

如果您不指定LINES子句,則默認值為假設您寫下如下語句時的值:

LINES TERMINATED BY '
' STARTING BY ''

換句話說,當讀取輸入值時,默認值會使LOAD DATA INFILE按如下方式運行:

·         在新行處尋找行的邊界。

·         不會跳過任何行前綴。

·         在制表符處把行分解為字段。

·         不希望字段被包含在任何引號字符之中。

·         出現制表符、新行、或在‘’前有‘’時,理解為作為字段值一部分的文字字符。

相反的,當編寫輸出值時,默認值會使SELECT...INTO OUTFILE按如下方式運行:

·         在字段之間寫入制表符。

·         不把字段包含在任何引號字符中。

·         當字段值中出現制表符、新行或‘’時,使用‘’進行轉義。

·         在行的末端寫入新行。

注意,要寫入FIELDS ESCAPED BY \’,您必須為待讀取的值指定兩個反斜杠,作為一個單反斜杠使用。

注釋:如果您已經在Windows系統中生成了文本文件,您可能必須使用LINES TERMINATED BY ’來正確地讀取文件,因為Windows程序通常使用兩個字符作為一個行終止符。部分程序,比如WordPad,當編寫文件時,可能會使用 作為行終止符。要讀取這樣的文件,應使用LINES TERMINATED BY ’。

如果所有您希望讀入的行都含有一個您希望忽略的共用前綴,則您可以使用'prefix_string'來跳過前綴(和前綴前的字符)。如果某行不包括前綴,則整個行被跳過。注釋:prefix_string會出現在一行的中間。

示例:

mysql> LOAD DATA INFILE '/tmp/test.txt'
    -> INTO TABLE test LINES STARTING BY "xxx";

使用此語句,您可以讀入包含有如下內容的文件:

xxx"row",1
something xxx"row",2

并只得到數據("row",1)("row",2)

IGNORE number LINES選項可以被用于在文件的開始處忽略行。例如,您可以使用IGNORE 1 LINES來跳過一個包含列名稱的起始標題行:

mysql> LOAD DATA INFILE '/tmp/test.txt'
    -> INTO TABLE test IGNORE 1 LINES;

當您聯合使用SELECT...INTO OUTFILELOAD DATA INFILE來從一個數據庫中把數據寫入一個文件中,然后再讀取文件,返回到數據庫中時,用于兩個語句的field-line-handling選項必須匹配。否則,LOAD DATA INFILE不會正確地理解文件的內容。假設您使用SELECT...INTO OUTFILE來編寫一個的文件,字段由逗號分隔:

mysql> SELECT * INTO OUTFILE 'data.txt'
    ->          FIELDS TERMINATED BY ','
    ->          FROM table2;

要讀取由逗號分隔的文件并返回,則正確的語句應該是:

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 '	';

結果很可能是,每個輸入行被理解為一個單一字段。

LOAD DATA INFILE也可以被用于讀取從外源中獲取的文件。例如,一個dBASE格式的文件具有以逗號分隔并且包含在雙引號中的字段。如果文件中的各行以新行為結尾,則此處所示的語句描述了您可以用于載入文件的field-line-handling選項:

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

所有field-line-handling選項都可以指定一個空字符串('')。如果字符串不是空的,則FIELDS [OPTIONALLY] ENCLOSED BYFIELDS ESCAPED BY值必須為單一字符。FIELDS TERMINATED BY, LINES STARTING BYLINES TERMINATED BY值可以超過一個字符。例如,要編寫由回車/換行成對字符作為結尾的行,或讀取包含這類行的文件,則應指定一個LINES TERMINATED BY ’子句。

如果jokes被由%%組成的行分隔,要讀取包含jokes的文件,您可以這么操作:

mysql> CREATE TABLE jokes
    ->     (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->     joke TEXT NOT NULL);
mysql> LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes
    ->     FIELDS TERMINATED BY ''
    ->     LINES TERMINATED BY '
%%
' (joke);

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"

如果您指定了OPTINALLY,則ENCLOSED BY字符只被用于包含具有字符串數據類型(比如CHAR, BINARY, TEXTENUM)的列中的值:

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字符作為前綴,對ENCLOSED 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字符為開始,當出現這類字符時,只有后面接著字段或行TERMINATED 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 BYLINES TERMINATED BY值的第一個字符

·         ASCII 0(在轉義符之后編寫的字符實際上是ASCII0’,而不是一個值為0的字節)

如果FIELDS ESCAPED BY字符為空字符,則沒有字符被轉義,并且NULL被作為NULL輸出,而不是N。去指定一個空的轉義符不是一個好辦法,特別是如果數據的字段值包含任何剛給定的清單中的字符時,更不能這么做。

對于輸入值,如果FIELDS ESCAPED BY字符不是空字符,則出現這種字符時會被剝離,然后以下字符被作為字段值的一部分。例外情況是,被轉義的‘0’或‘N’(例如,

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html
北斗有巢氏 有巢氏北斗