久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql中load data infile怎么用

150次閱讀
沒有評論

共計 9018 個字符,預計需要花費 23 分鐘才能閱讀完成。

丸趣 TV 小編給大家分享一下 mysql 中 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 語句以很高的速度從一個文本文件中讀取行到一個表中。文件名必須是一個文字字符串。

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

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

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

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

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

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

bull;  如果指定了 LOCAL,客戶端主機上的客戶端組件讀取文件并發送到服務器。可以給出文件的完整路徑以確定其精確位置。如果給出的是相對路徑,則文件名是相對于客戶端組件啟動時所在的目錄。

bull;  如果沒有指定 LOCAL,文件是位于服務器的主機上,并且直接被服務器讀取。

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

bull;  如果給定完整的路徑,服務器使用該路徑名。

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

bull;  如果給定沒有前置構件的文件名,服務器從當前的數據庫目錄搜尋文件。

  注意:

  這些規則意味著,一個以 /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 表現如下:

bull;  在換行符處尋找行的邊界。

bull;  不遺漏任何行前綴。

bull;  在制表符處將行分離成字段。

bull;  不認為字段由任何引號字符封裝。

bull;  將有“\”開頭的定位符、換行符或 `\ 解釋為字段值的一個文字字符。

相反的,當寫入輸出時,缺省值導致 SELECT … INTO OUTFILE 表現如下:

bull;  在字段值間加上制表符。

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

bull;  使用“\”轉義出現在字段值中的定位符、換行符或 `\ 字符實例。

bull;  在行的結尾處加上換行符。

  注意:

為了寫 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 字符不是空的,它將被用于做為下列輸出字符的前綴:

bull;  FIELDS ESCAPED BY 字符

bull;  FIELDS [OPTIONALLY] ENCLOSED BY 字符。

bull;  FIELDS TERMINATED BY 和 LINES TERMINATED BY 值的第一個字符。

bull;  ASCII 0(實際上在轉義字符后寫上 ASCII 0,而不是一個零值字節)。

如果 FIELDS ESCAPED BY 字符為空,那么將沒有字符被轉義并且 NULL 值仍輸出為 NULL,而不是 \N。指定一個空的轉義字符可能不是一個好的方法,特別是用戶的數據字段值中包含剛才列表中的任何字符時。

對于輸入值,如果 FIELDS ESCAPED BY 字符不是空字符,則出現這種字符時會被剝離,然后以下字符被作為字段值的一部分。例外情況是,被轉義的 lsquo;0 rsquo; 或 lsquo;N rsquo;(例如,或 \N,此時轉義符為 lsquo;\ rsquo;)。這些序列被理解為 ASCII NUL(一個零值字節)和 NULL。用于 NULL 處理的規則在本節的后部進行說明。

關于更多的“\”轉義語法信息,查看文字值。

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

bull;  如果 LINES TERMINATED BY 是一個空字符串,FIELDS TERMINATED BY 是非空的,則各行以 FIELDS TERMINATED BY 作為結尾。

bull;  如果 FIELDS TERMINATED BY 和 FIELDS ENCLOSED BY 值都是空的 (),那么一個固定行 ( 無定界符) 格式將被使用。用固定行格式時,在字段之間不使用分隔符(但是用戶仍然有一個行終結符)。列值的寫入和讀取使用列的“顯示”寬度。例如,如果一個列被定義 為 INT(7),列的值將使用 7 個字符的字段被寫入。對于輸入,列值通過讀取 7 個字符來獲得。

LINES TERMINATED BY 仍然用于分離行。如果一行沒有包含所有的字段,那么列的剩余部分被設置為它們的默認值。如果用戶沒有一個行終結符,用戶應該設置它為。在這種情況下,文本文件必須包含每行的所有的字段。

固定行格式也影響對 NULL 值的處理;見下面。注意,如果用戶正在使用一個多字節的字符集,固定長度格式將不能工作。

NULL 值的處理有很多,取決于用戶所使用的 FIELDS 和 LINES 選項:

bull;  對于缺省的 FIELDS 和 LINES 值,輸出時,NULL 被寫成 \N,當讀入時,\N 被作為 NULL 讀入(假設 ESCAPED BY 字符為“\”)。

bull;  如果 FIELDS ENCLOSED BY 不是空值,則包含以文字詞語 NULL 為值的字段被作為 NULL 值讀取。這與被 FIELDS ENCLOSED BY 字符包圍的詞語 NULL 不同。該詞語被作為字符串 NULL 讀取。

bull;  如果 FIELDS ESCAPED BY 是空的,NULL 值被寫為詞 NULL。

bull;  采用固定行格式時(當 FIELDS TERMINATED BY 和 FIELDS ENCLOSED BY 均為空值時采用),NULL 被作為一個空字符串寫入。注意,這會導致在被寫入文件時,表中的 NULL 值和空字符串均無法辨別,這是因為兩者都被作為空字符串寫入。如果用戶需要在讀取文件并返回時能夠分辨兩者,則用戶不應使用固定行格式。

一些不能被 LOAD DATA INFILE 支持的情況:

bull;  固定尺寸的記錄行(FIELDS TERMINATED BY 和 FIELDS ENCLOSED BY 均為空)和 BLOB 或 TEXT 列。

bull;  如果用戶指定一個分隔符與另一個相同,或是另一個的前綴,LOAD DATA INFILE 可能會不能正確地解釋輸入。例如,下列的 FIELDS 子句將會產生問題:

FIELDS TERMINATED BY ENCLOSED BY

bull; 

bull;  如果 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 子句要受到一下限制:

bull;  SET 子句中的賦值列名應當只能在賦值操作符的左邊。

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

bull;  對于列 / 變量列表或 SET 子句,由于使用 IGNORE 子句而被忽略的行就不會被處理。

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

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

如果輸入的記錄行有太多的字段,多余的字段將被忽略,并增加警告的數目。

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

一個空的字段值不同于字段值丟失的解釋:

bull;  對于字符串類型,列被設置為空字符串。

bull;  對于數字類型,列被設置為 0。

bull;  對于日期和時間類型,列被設置為適合列類型的“零”值。參考日期和時間類型。

如果在一個 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

看完了這篇文章,相信你對“mysql 中 load data infile 怎么用”有了一定的了解,如果想了解更多相關知識,歡迎關注丸趣 TV 行業資訊頻道,感謝各位的閱讀!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-15發表,共計9018字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 广东省| 石首市| 三原县| 定远县| 芮城县| 西青区| 金溪县| 海南省| 林口县| 永丰县| 交口县| 长岛县| 玛沁县| 廊坊市| 高清| 宜丰县| 乐山市| 中方县| 新蔡县| 巫山县| 两当县| 崇州市| 巴东县| 德州市| 正定县| 湘西| 许昌市| 永定县| 区。| 武穴市| 利川市| 太湖县| 阳西县| 吉木乃县| 长垣县| 九台市| 葫芦岛市| 凯里市| 衢州市| 双桥区| 峨眉山市|