MySQL培訓教程:批量導入數據命令
最新學訊:近期OCP認證正在報名中,因考試人員較多請盡快報名獲取最近考試時間,報名費用請聯系在線老師,甲骨文官方認證,報名從速!
我要咨詢MySQL培訓教程:批量導入數據命令,通常,創建完新數據庫后,我們就可以從舊的MySQL數據庫將數據導入到新庫中。在圖書數據庫中,假設一個賣主發給我們一個磁盤,磁盤內的一個純文本文件中列出了他們所有的圖書信息。每本書的記錄是單獨的一行,豎線把每個記錄的字段分開。下面是一個虛構的賣主數據文本文件:
- ISBN|TITLE|AUTHOR LAST|AUTHOR FIRST|COPYRIGHT DATE|
- 067973452X|Notes from Underground|Dostoevsky|Fyodor|August 1994|
- ...
顯然,真實的賣主數據文件中包含的字段要比上面列出的記錄中的字段多,但對于展示該功能的示例而言,這已經足夠了。第一行是記錄中字段的描述。不需要提取第一行,對于我們而言,它只是對字段的說明。因此,輸入SQL語句時可讓MySQL將其忽略。
就數據而言,我們必須關注以下幾個問題。首先,字段并沒有按表中的順序排列。我們必須讓MySQL知道將要導入的數據的順序,以便做調整。另一個問題是,文本文件中既包含books表的數據,也有authors表的數據。這個問題比較麻煩,但還是可以解決的。我們僅用一條SQL語句就可以提取作者的信息,然后再運行一個單獨的SQL語句導入圖書信息。在開始操作前,我們先將名為books.txt的賣主文件復制到臨時目錄(例如:/tmp)。現在,可以從mysql客戶機運行LOAD DATA INFILE語句了:
- LOAD DATA INFILE '/tmp/books.txt' REPLACE INTO TABLE authors
- FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n'
- TEXT_FIELDS(col1, col2, col3, col4, col5)
- SET author_last = col3, author_?rst = col4
- 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語句如下所示:
- ALTER TABLE authors
- ADD COLUMN col1 VARCHAR(50),
- ADD COLUMN col2 VARCHAR(50),
- ADD COLUMN col5 VARCHAR(50);
- LOAD DATA INFILE '/tmp/books.txt' REPLACE INTO TABLE authors
- FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n'
- IGNORE 1 LINES
- (col1, col2, author_last, author_?rst, col5);
- ALTER TABLE authors
- DROP COLUMN col1,
- DROP COLUMN col2,
- DROP COLUMN col5;
執行這些語句也可達到預期的目的,但并沒有前面的SQL語句那樣簡單明了。上述第二個SQL語句中IGNORE子句指定了將被忽略的行。該語句的最后一行列出了authors表中的所有列,這些列將接收數據,并且按照數據導入的順序排列。第三個SQL語句結束從賣主的文本文件中導入數據的操作,現在我們使用DROP語句刪除臨時列以及列中的數據。DROP語句執行后就不能撤消了。因此要慎用該語句。
如果我們想從文本文件中將作者信息列復制到authors表中,則需要先裝載books表中的數據,得到每本書正確的author_id值,通過下列語句可實現:
- LOAD DATA INFILE '/tmp/books.txt' IGNORE INTO TABLE books
- FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n'
- TEXT_FIELDS(col1, col2, col3, col4, col5)
- SET isbn = col1, title = col2,
- pub_year = RIGHT(col5, 4),
- author_id =
- (SELECT author_id
- WHERE author_last = col3
- AND author_?rst = col4)
- 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語句了。