mysql load data infile的使用 和 SELECT into outfile備份數據庫數據

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

   [REPLACE | IGNORE]sql

  INTO TABLE tbl_name數據庫

   [FIELDS安全

    [TERMINATED BY 'string']服務器

   [[OPTIONALLY] ENCLOSED BY 'char']網絡

   [ESCAPED BY 'char' ]併發

 ]性能

   [LINESspa

   [STARTING BY 'string']線程

  [TERMINATED BY 'string']

  ]

   [IGNORE number LINES]

  [(col_name_or_user_var,...)]

   [SET col_name = expr,...]]

LOAD DATA INFILE 語句以很高的速度從一個文本文件中讀取行到一個表中。文件名必須是一個文字字符串。

關於INSERT 與LOAD DATA INFILE 的效率和提升LOAD DATA INFILE 速度的更多信息,參考管理員手冊中的加速INSERT 語句 。

系統變量character_set_database 所指出的字符集被用來解釋文件中的信息。SET NAMES 和設置character_set_client 不會影響輸入的解釋。

用戶也可使用import 實用程序裝載數據文件;它經過發送一個LOAD DATA INFILE 命令到服務器來實現。--local 選項使得import 從客戶端主機讀取數據文件。若是客戶端與服務器支持壓縮協議,用戶能夠指定--compress 選項,以在較慢的網絡中得到更好的性能。參考管理員手冊中的import — 數據導入程序 。

若是用戶指定關鍵詞LOW_PRIORITY,LOAD DATA 語句的執行將會被延遲,直到沒有其它的客戶端正在讀取表。

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

若是指定了LOCAL 關鍵字,它將對鏈接的客戶端作出解釋:

•     若是指定了LOCAL,客戶端主機上的客戶端組件讀取文件併發送到服務器。能夠給出文件的完整路徑以肯定其精確位置。若是給出的是相對路徑,則文件名是相對於客戶端組件啓動時所在的目錄。

•     若是沒有指定LOCAL,文件是位於服務器的主機上,而且直接被服務器讀取。

當從服務器主機定位文件時,服務器使用下列規則:

•     若是給定完整的路徑,服務器使用該路徑名。

•     若是給定一個或多個前置構件的相對路徑,服務器以相對服務器的數據目錄搜索文件。

•     若是給定沒有前置構件的文件名,服務器從當前數據庫的數據庫目錄搜尋文件。

  注意:

 

 這些規則意味着,一個以'/gsfile.txt' 給出的文件是從服務器的數據目錄中讀取的,然而,以`gsfile.txt' 給出的一個文件是從當前數據庫的數據目錄下讀取的。舉例來講,下面的LOAD DATA 語句從db1 數據庫目錄下讀取文件'data.txt',由於db1 是當前數據庫,即便語句明確把文件載入到db2數據庫中的表裏,也會從db1 目錄中讀取:

 

sqlcli> USE db1;

sqlcli> LOAD DATA INFILE 'data.txt' INTO TABLE db2.gs_table;

 

  注意:

 

指定Windows 路徑名時,使用的是斜線而不是反斜線。若是要用反斜線,必須雙寫。

出於安全的緣由,當讀取位於服務器上的文本文件時,文件必須位於數據庫目錄下或者能夠被全部用戶讀取。也就是說,當對服務器上的文件執行LOAD DATA INFILE 時,用戶必須得到FILE 權限。

參考管理員手冊中的GBase 提供的權限 。

與服務器直接訪問文件相比,使用LOCAL 速度稍微慢些,這是由於文件的內容必須經過客戶端到服務器的鏈接傳送。另外一方面,對於本地文件,不須要得到FILE 權限。

只有服務器和客戶端都容許時,LOCAL 才能夠工做。例如,若是kernel 啓動時,--local-infile=0,則LOCAL 不能工做。參考管理員手冊中的LOAD DATA LOCAL 的安全問題 。

REPLACE 和IGNORE 關鍵字處理那些與已存在的主鍵值重複的輸入記錄。

若是指定了REPLACE,輸入行將會代替已存在的行(也就是說,主索引值相同的行將做爲存在的行)。參考REPLACE 語法 。

若是指定了IGNORE,與已存在行主鍵值重複的輸入行將被跳過。若是不指定兩者中的任一個,則操做行爲將依賴是否指定了LOCAL 關鍵字。沒有指定LOCAL,則若是發現有重複的鍵值,將產生一個錯誤,並忽略文本文件的其他部分。若是指定了LOCAL,則缺省的操做行爲將與指定了 IGNORE 的相同;這是由於,在操做過程當中,服務器沒有辦法終止文件的傳送。

若是但願裝載操做中忽略外鍵約束,能夠在執行LOAD DATA 以前執行SET FOREIGN_KEY_CHECKS=0 語句。

若是用戶在一個空的GsSYS 表上使用LOAD DATA INFILE,全部非惟一索引會以分批方式被建立(就像REPAIR)。當有許多索引時,這一般可使LOAD DATA INFILE 更快一些。正常狀況下很是快,但也有極端的狀況,用戶能夠經過在裝載文件以前使用ALTER TABLE .. DISABLE KEYS 關閉它們和在裝載文件以後使用ALTER TABLE .. ENABLE KEYS 重建索引,從而加速索引建立。參考管理員手冊中的加速INSERT 語句 。

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' STARTING BY ''

換句話說,當讀取輸入時,缺省的LOAD DATA INFILE 表現以下:

•     在換行符處尋找行的邊界。

•     不遺漏任何行前綴。

•     在製表符處將行分離成字段。

•     不認爲字段由任何引號字符封裝。

•     將有 「\」 開頭的定位符、換行符或`\' 解釋爲字段值的一個文字字符。

相反的,當寫入輸出時,缺省值致使SELECT ... INTO OUTFILE 表現以下:

•     在字段值間加上製表符。

•     不用任何引號字符封裝字段。

•     使用 「\」 轉義出如今字段值中的定位符、換行符或`\' 字符實例。

•     在行的結尾處加上換行符。

  注意:

 

爲了寫FIELDS ESCAPED BY '\\',用戶必須指定兩個反斜線,該值會做爲一個反斜線被讀入。

  注意:

 

若是是Windows 系統的 文本文件,可能必須使用LINES TERMINATED BY '\r\n' 來讀取文件,這是由於Windows 系統的特色是使用兩個字符做爲行終止符。在某些程序中,在書寫文件時,可能使用\r 做爲行終止符,如寫字板。讀取這類文件時,須要用LINES TERMINATED BY '\r'。

若是全部的將要讀取的行都有用戶但願忽略的前綴,可使用LINES STARTING BY 'prefix_string' 來跳過此前綴(和在它前面的任何內容)。若是一個行沒有此前綴,則整個行都被跳過。注意,prefix_string 可能在行的中間!

例如:

sqlcli> 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 來跳過含有列名的的頭一行:

sqlcli> LOAD DATA INFILE '/tmp/test.txt'

-> INTO TABLE test IGNORE 1 LINES;

當用戶一前一後地使用SELECT ... INTO OUTFILE 和LOAD DATA INFILE 將數據從一個數據庫寫到一個文件中,而後再從文件中將它讀入數據庫中時,兩個命令的字段和行處理選項必須匹配。不然,LOAD DATA INFILE 將不能正確地解釋文件內容。假設用戶使用SELECT ... INTO OUTFILE 以逗號分隔字段的方式將數據寫入到一個文件中:

sqlcli> SELECT * INTO OUTFILE 'data.txt'

->     FIELDS TERMINATED BY ','

->     FROM table2;

爲了將由逗號分隔的文件讀回時,正確的語句應該是:

sqlcli> LOAD DATA INFILE 'data.txt' INTO TABLE table2

->     FIELDS TERMINATED BY ',';

若是用戶試圖用下面所示的語句讀取文件,它將不會工做,由於命令LOAD DATA INFILE 以定位符區分字段值:

sqlcli> LOAD DATA INFILE 'data.txt' INTO TABLE table2

->     FIELDS TERMINATED BY '\t';

可能的結果是每一個輸入行將被解釋爲一個單獨的字段。

LOAD DATA INFILE 也能夠被用來讀取外部源得到的文件。例如,dBASE 格式的文件,字段以逗號分隔並以雙引號包圍着。若是文件中的行以一個換行符終止,那麼下面所示的能夠說明用戶將用來裝載文件的字段和行處理選項:

sqlcli> 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 值能夠超過一個字符。例如,爲了寫入由回車換行符終止的行,或讀取包含這樣的行的文件,應該指定一個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,BINARY,TEXT 或ENUM):

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 字符開始,只要後面緊跟着字段或行TERMINATED 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 字符爲空,那麼將沒有字符被轉義而且NULL 值仍輸出爲NULL,而不是\N。指定一個空的轉義字符可能不是一個好的方法,特別是用戶的數據字段值中包含剛纔列表中的任何字符時。

對於輸入值,若是FIELDS ESCAPED BY 字符不是空字符,則出現這種字符時會被剝離,而後如下字符被做爲字段值的一部分。例外狀況是,被轉義的‘0’或‘N’(例如,\0 或\N,此時轉義符爲‘\’)。這些序列被理解爲ASCII NUL(一個零值字節)和NULL。用於NULL 處理的規則在本節的後部進行說明。

關於更多的 「\」 轉義語法信息,查看文字值 。

在某些狀況下,字段與行處理相互做用:

•     若是LINES TERMINATED BY 是一個空字符串,FIELDS TERMINATED BY 是非空的,則各行以FIELDS TERMINATED BY做爲結尾。

•     若是FIELDS TERMINATED BY 和FIELDS ENCLOSED BY 值都是空的(''),那麼一個固定行(無定界符) 格式將被使用。用固定行格式時,在字段之間不使用分隔符(可是用戶仍然有一個行終結符)。列值的寫入和讀取使用列的「顯示」寬度。例如,若是一個列被定義 爲INT(7),列的值將使用7 個字符的字段被寫入。對於輸入,列值經過讀取7 個字符來得到。

LINES TERMINATED BY 仍然用於分離行。若是一行沒有包含全部的字段,那麼列的剩餘部分被設置爲它們的默認值。若是用戶沒有一個行終結符,用戶應該設置它爲''。在這種狀況下,文本文件必須包含每行的全部的字段。

固定行格式也影響對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 ENCLOSED BY 或LINES TERMINATED BY 後面緊跟着FIELDS TERMINATED BY 的值時,將會引發LOAD DATA INFILE 過早地中止讀取一個字段或一行。這是由於LOAD DATA INFILE 不知道字段或行值在哪裏結束。

下面的例子將裝載persondata 表的全部列:

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

默認狀況下,當LOAD DATA INFILE 語句後沒有提供字段列時,那麼LOAD DATA INFILE 認爲輸入行包含表列中全部的字段。若是用戶但願裝載表中的某些列,那指定一個字段列表:

sqlcli> LOAD DATA INFILE 'persondata.txt'

-> INTO TABLE persondata (col1,col2,...);

若是輸入文件的字段順序不一樣於表中列的順序,用戶也必須指定一個字段列表。不然GBase 不知道如何將輸入字段與表中的列匹配。

Column 列表能夠包含列名或者用戶變量,而且支持SET 子句。這使得能用輸入值給用戶變量賦值, 並在賦予列的結果以前對這些值進行變換。

SET 子句中的用戶變量有多種用途。下面的例子將數據文件的第一列直接做爲t1.column1 的值,並將第二列賦予一個用戶變量,此變量在做爲t2.column2 的值以前進行一個除法操做

LOAD DATA INFILE 'file.txt'

   INTO TABLE t1

   (column1, @var1)

   SET column2 = @var1/100;

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, @dummy, column2, @dummy, column3);

使用列/變量列表和SET子句要受到一下限制:

•     SET 子句中的賦值列名應當只能在賦值操做符的左邊。

•     在SET 賦值語句中,可使用子查詢。此查詢返回一個將被賦予列的值,它可能僅僅是一個標量查詢。不能用子查詢去查詢將被導入的表。

•     對於列/變量列表或SET 子句,因爲使用IGNORE 子句而被忽略的行就不會被處理。

•     因爲用戶變量沒有顯示寬度,當導入的數據是行固定格式時,將不能使用用戶變量。

當處理輸入行時,LOAD DATA 將行分爲域,若是提供了列/變量列表和SET 子句,將按照它去使用這些值。而後獲得的行就插入到表中。若是此表有BEFORE INSERT 或AFTER INSERT 觸發器,則插入行先後將分別激活它們。

若是輸入的記錄行有太多的字段,多餘的字段將被忽略,並增長警告的數目。

若是一個輸入行的字段較少,沒有輸入字段的列將被設置爲缺省值。缺省值賦值在CREATE TABLE 語法 中被描述。

一個空的字段值不一樣於字段值丟失的解釋:

•     對於字符串類型,列被設置爲空字符串。

•     對於數字類型,列被設置爲0。

•     對於日期和時間類型,列被設置爲適合列類型的「零」值。參考日期和時間類型 。

若是在一個INSERT 或UPDATE 語句中明確地將一個空字符串賦給一個字符串、數字或日期或時間類型,用戶會獲得與上面相同的結果。

只有在兩種狀況下TIMESTAMP 列被設置爲當前日期和時間。一種狀況時當列有一個NULL 值(也就是\N)時;另外一種狀況是(僅對於第一個TIMESTAMP 列),當一個字段清單被指定時,TIMESTAMP 列會從字段清單中被略去。

LOAD DATA INFILE 認爲全部的輸入均是字符串,於是,對於ENUM 或SET 列,用戶不能以INSERT 語句的形式爲其設置數字值。全部的ENUM 和SET 必須以字符串指定!

當LOAD DATA INFILE 查詢結束時,它返回信息字符串,格式以下:

Records: 1 Deleted: 0 Skipped: 0 Warnings: 0

 

SELECT into outfile 備份數據庫數據

 
select email into outfile "test.txt" from email; 
 
select substring(boss,0,2),addr from guest; 
 
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]  INFILE 「/opt/abc.txt" INTO TABLE table_name     -www.2cto.com-  
 
FIELDS TERMINATED BY ',' (column1, column2,colum3); 
 
mysql> SELECT * FROM table1 INTO OUTFILE 'data.txt' 
FIELDS TERMINATED BY ',' 
FROM ... 
 
爲了將由逗號分隔的文件讀回來,正確的語句將是: 
 
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2 
FIELDS TERMINATED BY ',';   -www.2cto.com-
 
相反,若是你試圖用下面顯示的語句讀取文件,它不會工做,由於它命令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';   -www.2cto.com-
 
任何字段或行處理選項能夠指定一個空字符串('')。若是不是空,FIELDS [OPTIONALLY] ENCLOSED BY和 
 
FIELDS ESCAPED BY值必須是一個單個字符。FIELDS TERMINATED BY和LINES TERMINATED BY值能夠是超 
 
過一個字符。例如,寫入由回車換行符對(CR+LF)終止的行,或讀取包含這樣行的一個文件,指定一個 
 
LINES TERMINATED BY '\r \n'子句。  -www.2cto.com-
 
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" 
================= 
insert into tabl(id,email) select id, email from guest;
相關文章
相關標籤/搜索