1. 程式人生 > 其它 >MySQL-匯入與匯出

MySQL-匯入與匯出

CSV檔案匯入MySQL

LOAD DATA INFILE語句允許您從文字檔案讀取資料,並將檔案的資料快速匯入資料庫的表中。

匯入檔案操作之前,需要準備以下內容:

  一、將要匯入檔案的資料對應的資料庫表。

  二、準備好一個CSV檔案,其資料與表的列數和每列中的資料型別相匹配。

  三、連線到MySQL資料庫伺服器的帳戶具有FILEINSERT許可權。

首先,建立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,amout
4,"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函式,如下: