顾美玲勾引管家|日韩黄色成人|国产精品theporn动漫|欧美日日日|国产精品探花在线

專業只做數據庫實訓和認證的品牌機構

微信公眾號新浪微博
免費咨詢電話:400-0909-964
當前位置: 網站首頁 > MySQL培訓 > MySQL課程 > MySQL培訓教程:批量導入數據命令

MySQL培訓教程:批量導入數據命令

文章來源: 更新時間:2016/7/15 15:05:29

在線老師點擊咨詢:

最新學訊:近期OCP認證正在報名中,因考試人員較多請盡快報名獲取最近考試時間,報名費用請聯系在線老師,甲骨文官方認證,報名從速!

我要咨詢

MySQL培訓教程:批量導入數據命令,通常,創建完新數據庫后,我們就可以從舊的MySQL數據庫將數據導入到新庫中。在圖書數據庫中,假設一個賣主發給我們一個磁盤,磁盤內的一個純文本文件中列出了他們所有的圖書信息。每本書的記錄是單獨的一行,豎線把每個記錄的字段分開。下面是一個虛構的賣主數據文本文件:

  1. ISBN|TITLE|AUTHOR LAST|AUTHOR FIRST|COPYRIGHT DATE|  
  2. 067973452X|Notes from Underground|Dostoevsky|Fyodor|August 1994|  
  3. ... 

顯然,真實的賣主數據文件中包含的字段要比上面列出的記錄中的字段多,但對于展示該功能的示例而言,這已經足夠了。第一行是記錄中字段的描述。不需要提取第一行,對于我們而言,它只是對字段的說明。因此,輸入SQL語句時可讓MySQL將其忽略。

就數據而言,我們必須關注以下幾個問題。首先,字段并沒有按表中的順序排列。我們必須讓MySQL知道將要導入的數據的順序,以便做調整。另一個問題是,文本文件中既包含books表的數據,也有authors表的數據。這個問題比較麻煩,但還是可以解決的。我們僅用一條SQL語句就可以提取作者的信息,然后再運行一個單獨的SQL語句導入圖書信息。在開始操作前,我們先將名為books.txt的賣主文件復制到臨時目錄(例如:/tmp)。現在,可以從mysql客戶機運行LOAD DATA INFILE語句了:

  1. LOAD DATA INFILE '/tmp/books.txt' REPLACE INTO TABLE authors  
  2. FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n' 
  3. TEXT_FIELDS(col1, col2, col3, col4, col5)  
  4. SET author_last = col3, author_?rst = col4  
  5. IGNORE col1, col2, col5, 1 LINES; 

首先需要指出,盡管本書已多次出現IGNOREnLINES子句,但MySQL4.1及之前的版本并不支持與列相關的TXT_FIELDS和IGNORE子句。使用IGNORE1LINES,文本文件中包含列標題的第一行信息將被忽略。回到SQL語句的第一行,我們已經指定了將要導入的文件名以及將被裝載數據的表名。REPLACE標記與前面提到的REPLACE語句的作用相同。當然,姓名字段沒有設置成惟一值,就MySQL而言將不會出現任何重復數據的問題。在實際情況下,你還是應該修改數據表以防止作者姓名有重復。

在第二行中,我們指定每個字段以豎線作為結束符,每行以回車(\r)換行(\n)結束。這是對MS-DOS系統下的文本文件而言的。UNIX下僅以換行符作為行的結束。在第三行SQL語句中,我們為每個字段創建一個別名。在第四行語句中,基于前一行語句給出的別名,我們給表中將要接收數據的列設置別名。最后一行語句中,我們通知MySQL忽略不想要的列,以及第一行信息,因為這些被略去的內容不包含數據信息。

如果你使用的舊版本MySQL不支持忽略列的操作,則需執行幾個額外的步驟。有幾種不同的實現方式。如果將被裝載數據的表不是很大,則可以采用一個簡單的方法,就是為authors表添加三個額外的臨時列,這些列用于接收文本文件中想要略去的字段值以便以后將其刪除。實現上述操作的SQL語句如下所示:

  1. ALTER TABLE authors  
  2. ADD COLUMN col1 VARCHAR(50),  
  3. ADD COLUMN col2 VARCHAR(50),  
  4. ADD COLUMN col5 VARCHAR(50);  
  5.  
  6. LOAD DATA INFILE '/tmp/books.txt' REPLACE INTO TABLE authors  
  7. FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n' 
  8. IGNORE 1 LINES  
  9. (col1, col2, author_last, author_?rst, col5);  
  10.  
  11. ALTER TABLE authors  
  12. DROP COLUMN col1,  
  13. DROP COLUMN col2,  
  14. DROP COLUMN col5; 

執行這些語句也可達到預期的目的,但并沒有前面的SQL語句那樣簡單明了。上述第二個SQL語句中IGNORE子句指定了將被忽略的行。該語句的最后一行列出了authors表中的所有列,這些列將接收數據,并且按照數據導入的順序排列。第三個SQL語句結束從賣主的文本文件中導入數據的操作,現在我們使用DROP語句刪除臨時列以及列中的數據。DROP語句執行后就不能撤消了。因此要慎用該語句。

如果我們想從文本文件中將作者信息列復制到authors表中,則需要先裝載books表中的數據,得到每本書正確的author_id值,通過下列語句可實現:

  1. LOAD DATA INFILE '/tmp/books.txt' IGNORE INTO TABLE books  
  2. FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n' 
  3. TEXT_FIELDS(col1, col2, col3, col4, col5)  
  4. SET isbn = col1, title = col2,  
  5. pub_year = RIGHT(col5, 4),  
  6. author_id =  
  7.  
  8. SELECT author_id  
  9. WHERE author_last = col3  
  10. AND author_?rst = col4)  
  11.  
  12. IGNORE col3, col4, 1 LINES;  

在這個SQL語句中,我們添加了幾個方法來獲取所需結果。在第五行中,我們使用字符串函數RIGHT()從copyright字段中提取年份(copyright字段中包含年和月)。RIGHT()函數提取了指定的第二個參數col5中的后四個字符。在第六行中,通過一個子查詢獲取了基于authors表的author_id值,author表中作者的姓和名字分別與各自的別名相匹配。圓括號中列的查詢結果將被賦給author_id列。

最后,我們令MySQL忽略col3、col4以及列的標題行。第一行中的IGNORE標記告知MySQL忽略出錯信息,不需要替換重復行,繼續執行SQL語句。使用早期的MySQL版本完成這項工作需要像前面示例中提到那樣,建立臨時列或臨時表。實際上,使用臨時表分段導入數據是一種謹慎的方法。上述步驟驗證完畢后,即可執行INSERT......SELECT語句了。

本文地址:http://www.mudan321.com/mysql/kecheng/12481595594.html 轉載請注明!


PostgreSQL入門到精通 100+ 個學習資料

Oracle培訓機構

金牌講師<>

冉乃綱-老師CUUG金牌講師
冉老師 CUUG金牌講師 Oracle及RedHat高級講師、Unix/Linux 資深專家...[詳細了解老師]

免費咨詢上課流程 客服在線中

陳衛星-老師CUUG金牌講師
陳老師 CUUG金牌講師 精通Oracle管理、備份恢復、性能優化 11年Ora...[詳細了解老師]

免費咨詢上課流程 客服在線中

選學校如何選擇適合自己的學校

CUUG -CHINA UNIX USER GROUP,是國際UNIX組織UNIFORUM的中國代表,是國內悠久的專業UNIX培訓機構,被譽為中國UNIX 的搖籃。多年來,以提高教學質量為本,強調素質教育,積極引進、消化國外的新技術,有效的結合中國....[詳情]

一站式服務(從入學到就業一幫到底)

入學

學習

就業

實操

食宿
地址:北京市海淀區田村山南路35號院17號樓
課程咨詢: 400-0909-964
企業服務:137 1818 8639(陳經理)
部分信息來源于網絡,如有錯誤請聯系指正!
版權所有@北京神腦資訊技術有限公司 (CUUG,中國UNIX用戶協會) Copyright 2016 ALL Rights Reserved 京ICP備11008061號-1