load的語法
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 語句用于高速地從一個文本文件中讀取行,并裝入一個表中。文件名稱必須為一個文字字符串。
由 character_set_database 系統變量指示的字符集被用于解釋文件中的信息。 SET NAMES 和 character_set_client 的設置不會影響對輸入的解釋。
典型的示例
LOAD DATA LOCAL INFILE ' data.txt ' INTO TABLE tbl_name FIELDS TERMINATED BY ' , ' OPTIONALLY ENCLOSED BY ' " ' LINES TERMINATED BY ' \n '
如果您只想載入一個表的部分列,則應指定一個列清單:
LOAD DATA LOCAL INFILE ' persondata.txt ' INTO TABLE persondata (col1,col2);
?
文件的路徑
如果指定了 LOCAL ,則被認為與連接的客戶端有關:
- ? 如果指定了 LOCAL ,則文件會被客戶主機上的客戶端讀取,并被發送到服務器。文件會被給予一個完整的路徑名稱,以指定確切的位置。如果給定的是一個相對的路徑名稱,則此名稱會被理解為相對于啟動客戶端時所在的目錄。
- ? 如果 LOCAL 沒有被指定,則文件必須位于服務器主機上,并且被服務器直接讀取。
當在服務器主機上為文件定位時,服務器使用以下規則:
- 如果給定了一個絕對的路徑名稱,則服務器使用此路徑名稱。
- 如果給定了帶有一個或多個引導組件的相對路徑名稱,則服務器會搜索相對于服務器數據目錄的文件。
- 如果給定了一個不帶引導組件的文件名稱,則服務器會在默認數據庫的數據庫目錄中尋找文件。
注意,這些規則意味著名為 ./myfile.txt 的文件會從服務器數據目錄中被讀取,而名為 myfile.txt 的同樣的文件會從默認數據庫的數據庫目錄中讀取。
?
從客戶端使用絕對路徑load數據
LOAD DATA LOCAL INFILE ' /import/data.txt ' INTO TABLE db2.my_table;
?
從服務器里使用相對路徑load數據
下面的LOAD DATA語句會從db1數據庫目錄中讀取文件data.txt,因為db1是當前數據庫。即使語句明確把文件載入到db2數據庫中的表里,也會從db1目錄中讀取。
USE db1; LOAD DATA INFILE ' data.txt ' INTO TABLE db2.my_table;
?
IGNORE? number ?LINES選項
IGNORE? number ?LINES選項可以被用于在文件的開始處忽略行。
您可以使用IGNORE 1 LINES來跳過一個包含列名稱的起始標題行:
LOAD DATA INFILE ' /tmp/test.txt ' INTO TABLE test IGNORE 1 LINES;
?
REPLACE和IGNORE
有些輸入記錄把原有的記錄復制到唯一關鍵字值上。 REPLACE 和 IGNORE 關鍵字用于控制這些輸入記錄的操作。
如果您指定了 REPLACE ,則輸入行會替換原有行(換句話說,與原有行一樣,對一個主索引或唯一索引具有相同值的行)。
如果您指定 IGNORE ,則把原有行復制到唯一關鍵字值的輸入行被跳過。
?
如果您這兩個選項都不指定,則運行情況根據 LOCAL 關鍵詞是否被指定而定。不使用 LOCAL 時,當出現重復關鍵字值時,會發生錯誤,并且剩下的文本文件被忽略。使用 LOCAL 時,默認的運行情況和 IGNORE 被指定時的情況相同;這是因為在運行中間,服務器沒有辦法中止文件的傳輸。
?
索引的影響
如果您對一個空的 MyISAM 表使用 LOAD DATA INFILE ,則所有的非唯一索引會被創建在一個獨立批中(對于 REPAIR TABLE )。當您有許多索引時,這通常會使 LOAD DATA INFILE 大大加快。通常, LOAD DATA INFILE 的速度會非???,但是在某些極端情況下,您可以在把文件載入到表中之前使用 ALTER TABLE...DISABLE KEYS 關閉 LOAD DATA INFILE ,或者在載入文件之后使用 ALTER TABLE...ENABLE KEYS 再次創建索引,使創建索引的速度更快。
?
FIELDS和LINES的默認值
如果您不指定 FIELDS 子句,則默認值為假設您寫下如下語句時的值:
FIELDS TERMINATED BY ' \t ' ENCLOSED BY '' ESCAPED BY ' \\ '
如果您不指定 LINES 子句,則默認值為假設您寫下如下語句時的值:
LINES TERMINATED BY ' \n ' STARTING BY ''
換句話說,當讀取輸入值時,默認值會使 LOAD DATA INFILE 按如下方式運行:
在新行處尋找行的邊界。
不會跳過任何行前綴。
在制表符處把行分解為字段。
不希望字段被包含在任何引號字符之中。
出現制表符、新行、或在‘\’前有‘\’時,理解為作為字段值一部分的文字字符。
相反的,當編寫輸出值時,默認值會使 SELECT...INTO OUTFILE 按如下方式運行:
在字段之間寫入制表符。
不把字段包含在任何引號字符中。
當字段值中出現制表符、新行或‘\’時,使用‘\’進行轉義。
在行的末端寫入新行。
注意,要寫入 FIELDS ESCAPED BY? ‘ \\ ’,您必須為待讀取的值指定兩個反斜杠,作為一個單反斜杠使用。
備注: 如果您已經在 Windows 系統中生成了文本文件,您可能必須使用 LINES TERMINATED BY? ‘ \r\n ’來正確地讀取文件,因為 Windows 程序通常使用兩個字符作為一個行終止符。部分程序 ,當編寫文件時,可能會使用 \r 作為行終止符。要讀取這樣的文件,應使用 LINES TERMINATED BY? ‘ \r ’。
?
STARTING??LINES選項
如果所有您希望讀入的行都含有一個您希望忽略的共用前綴,則您可以使用 ' prefix_string ' 來跳過前綴(和前綴前的字符)。如果某行不包括前綴,則整個行被跳過。注釋: prefix_string 會出現在一行的中間。
以下面的test.txt為文件源
xxx"row", 1 something xxx"row", 2
使用以下sql導入數據
LOAD DATA INFILE ' /tmp/test.txt ' INTO TABLE test LINES STARTING BY "xxx";
最后 并只得到數據 ("row",1) 和 ("row",2) 。
?
TERMINATED?LINES選項
如果 jokes 被由 %% 組成的行分隔, 要讀取包含 jokes 的文件,您可以這么操作:
LOAD DATA INFILE ' /tmp/jokes.txt ' INTO TABLE jokes FIELDS TERMINATED BY '' LINES TERMINATED BY ' \n%%\n ' (joke);
?
TERMINATED,ENCLOSED,ESCAPED FIELD選項
TERMINATED用于控制字段的分隔符,可以為多個字符。
ENCLOSED BY用于用于控制字段的引號, 必須為單一字符, 如果您忽略了詞語 OPTIONALLY ,則所有的字段都被包含在 ENCLOSED BY 字符串中, 如果您指定了 OPTINALLY ,則 ENCLOSED BY 字符只被用于包含具有字符串數據類型(比如 CHAR, BINARY, TEXT 或 ENUM )的列中的值.
SELECT...INTO OUTFILE導出數據, ENCLOSED BY '"',忽略OPTIONALLY
" 1 ","a string"," 100.20 "
SELECT...INTO OUTFILE導出數據,ENCLOSED BY '"',指定OPTIONALLY
1 ,"a string", 100.20
ESCAPED BY用于轉義,FIELDS ESCAPED BY值必須為單一字符。
如果 FIELDS ESCAPED BY 字符為空字符,則沒有字符被轉義,并且 NULL 被作為 NULL 輸出,而不是 \N 。去指定一個空的轉義符不是一個好辦法,特別是如果數據的字段值包含任何剛給定的清單中的字符時,更不能這么做。
如果在字段值內出現 ENCLOSED BY 字符,則通過使用 ESCAPED BY 字符作為前綴,對 ENCLOSED BY 字符進行轉義。
?
轉自? http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#load-data
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
