MySQL-導入與導出
CSV文件導入MySQL
LOAD DATA INFILE
語句允許您從文本文件讀取數據,並將文件的數據快速導入數據庫的表中。
導入文件操作之前,需要準備以下內容:
一、將要導入文件的數據對應的數據庫表。
二、準備好一個CSV文件,其數據與表的列數和每列中的數據類型相匹配。
三、連接到MySQL數據庫服務器的帳戶具有FILE
和INSERT
權限。
首先,創建discounts
表:
use testdb; CREATE TABLE discounts ( id INT NOT NULL AUTO_INCREMENT, title VARCHAR(255) NOT NULL, expired_date DATE NOT NULL, amount DECIMAL(10 , 2 ) NULL, PRIMARY KEY (id) );
discounts.csv
文件的內容,第一行作為列標題和其他三行則為數據。
id,title,expired date,amout 1,"Spring Break 2018",20180401,20 2,"Back to Scholl 2017",20170901,29 3,"Summer 2018",20180820,100
接下來,將數據從F:/worksp/mysql/discounts.csv
文件導入到discounts
表。
LOAD DATA INFILE ‘F:/worksp/mysql/discounts.csv‘ INTO TABLE discounts FIELDS TERMINATED BY‘,‘ ENCLOSED BY ‘"‘ LINES TERMINATED BY ‘\n‘ IGNORE 1 ROWS;
文件的字段由FIELD TERMINATED BY ‘,‘
指示的逗號終止,並由ENCLOSED BY ‘"‘
指定的雙引號括起來。
因為文件第一行包含列標題,列標題不需要導入到表中,因此通過指定IGNORE 1 ROWS
選項來忽略第一行。
導入時轉換數據
數據格式與表中的目標列不匹配,用LOAD DATA INFILE
語句中的SET
子句進行轉換。
有一個discount_2.csv文件中,它存儲的過期日期列是mm/dd/yyyy格式。內容如下:
id,title,expired date,amout4,"Item-4","01/04/2018",200 5,"Item-5","01/09/2017",290 6,"Item-6","12/08/2018",122
將數據導入discounts
表時,必須使用str_to_date()函數將其轉換為MySQL日期格式
LOAD DATA INFILE ‘F:/worksp/mysql/discounts_2.csv‘
INTO TABLE discounts
FIELDS TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘
LINES TERMINATED BY ‘\n‘
IGNORE 1 ROWS
(id,title,@expired_date,amount)
SET expired_date = STR_TO_DATE(@expired_date, ‘%m/%d/%Y‘);
將文件從客戶端導入遠程MySQL數據庫服務器
使用LOAD DATA INFILE
語句將數據從客戶端(本地計算機)導入遠程MySQL數據庫服務器。
LOAD DATA INFILE
中使用LOCAL
選項時,客戶端程序會讀取客戶端上的文件並將其發送到MySQL服務器。該文件將被上傳到數據庫服務器操作系統的臨時文件夾,
Windows上的C:\windows\temp,此文件夾不可由MySQL配置或確定。
示例: LOAD DATA LOCAL INFILE ‘c:/tmp/discounts.csv‘ INTO TABLE discounts FIELDS TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘ LINES TERMINATED BY ‘\n‘ IGNORE 1 ROWS;
如果加載一個大的CSV文件,將會看到使用LOCAL
選項來加載該文件將會稍微慢些,因為需要時間將文件傳輸到數據庫服務器。
使用LOCAL
選項時,連接到MySQL服務器的帳戶不需要具有FILE
權限來導入文件。
MySQL導出CSV文件
導出數據之前,必須確保:
一、MySQL服務器的進程對包含目標CSV文件的目標文件夾具有寫訪問權限。
二、要導出的目標CSV文件不能存在。
示例: 查詢從orders表中查詢選擇已取消的訂單,將此結果集導出為CSV文件 SELECT orderNumber, status, orderDate, requiredDate, comments FROM orders WHERE status = ‘Cancelled‘ INTO OUTFILE ‘F:/worksp/mysql/cancelled_orders.csv‘ FIELDS ENCLOSED BY ‘"‘ TERMINATED BY ‘;‘ ESCAPED BY ‘"‘ LINES TERMINATED BY ‘\r\n‘;
該語句在F:/worksp/mysql/
目錄下創建一個包含結果集,名稱為cancelled_orders.csv
的CSV文件。
CSV文件包含結果集中的行集合。每行由一個回車序列和由LINES TERMINATED BY ‘\r\n‘
子句指定的換行字符終止。文件中的每行包含表的結果集的每一行記錄。
每個值由FIELDS ENCLOSED BY ‘"‘
子句指示的雙引號括起來。 這樣可以防止可能包含逗號(,
)的值被解釋為字段分隔符。 當用雙引號括住這些值時,該值中的逗號不會被識別為字段分隔符。
將數據導出到文件名包含時間戳的CSV文件
將數據導出到CSV文件中,該文件的名稱包含創建文件的時間戳。
將整個orders
表導出為將時間戳作為文件名的一部分的CSV文件。
SET @TS = DATE_FORMAT(NOW(),‘_%Y%m%d_%H%i%s‘); SET @FOLDER = ‘F:/worksp/mysql/‘; SET @PREFIX = ‘orders‘; SET @EXT = ‘.csv‘; SET @CMD = CONCAT("SELECT * FROM orders INTO OUTFILE ‘",@FOLDER,@PREFIX,@TS,@EXT, "‘ FIELDS ENCLOSED BY ‘\"‘ TERMINATED BY ‘;‘ ESCAPED BY ‘\"‘", " LINES TERMINATED BY ‘\r\n‘;"); PREPARE statement FROM @CMD; EXECUTE statement;
首先,構造了一個具有當前時間戳的查詢作為文件名的一部分。
其次,使用PREPARE
語句FROM
命令準備執行語句。
最後,使用EXECUTE
命令執行語句。
使用列標題導出數據
要添加列標題,需要使用UNION語句如下:
(SELECT ‘Order Number‘,‘Order Date‘,‘Status‘) UNION (SELECT orderNumber,orderDate, status FROM orders INTO OUTFILE ‘F:/worksp/mysql/orders_union_title.csv‘ FIELDS ENCLOSED BY ‘"‘ TERMINATED BY ‘;‘ ESCAPED BY ‘"‘ LINES TERMINATED BY ‘\r\n‘);
處理NULL值
如果結果集中的值包含NULL值,則目標文件將使用“N/A
”來代替數據中的NULL
值。要解決此問題,您需要將NULL
SELECT orderNumber, orderDate, IFNULL(shippedDate, ‘N/A‘) FROM orders INTO OUTFILE ‘F:/worksp/mysql/orders_null2na.csv‘ FIELDS ENCLOSED BY ‘"‘ TERMINATED BY ‘;‘ ESCAPED BY ‘"‘ LINES TERMINATED BY ‘\r\n‘; 用N/A字符串替換了shippingDate列中的NULL值。 CSV文件將顯示N/A而不是NULL值。
值替換為另一個值,例如不適用(
N/A
),方法是使用IFNULL函數,如下:
MySQL-導入與導出