MySQL - LOAD DATA 語句



LOAD DATA 語句

使用 LOAD DATA 語句,您可以將檔案的內容(來自伺服器或主機)插入到 MySQL 表中。如果您使用 LOCAL 子句,則可以將本地檔案的內容上傳到表中。

語法

以下是上述語句的語法:

LOAD DATA
   [LOCAL]
      INFILE 'file_name'
      [REPLACE | IGNORE]
      INTO TABLE tble_name
      [{FIELDS | COLUMNS}
         [TERMINATED BY 'string']
         [[OPTIONALLY] ENCLOSED BY 'char']
         [ESCAPED BY 'char']

在討論一些示例之前,首先讓我們驗證是否啟用了載入本地資料,如果沒有,您可以觀察 local_infile 變數的值,如下所示:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

以下是上述查詢的輸出:

變數名稱
local_infile OFF

在從檔案載入資料之前,請確保已啟用 **local_infile** 選項,如下所示:

SET GLOBAL local_infile = 'ON';

請確保您已向資料庫授予檔案(或所有)許可權,您的表存在於該資料庫中:

GRANT ALL ON test.* TO 'root'@'localhost';

示例

假設我們使用如下所示的 CREATE 語句建立了一個表:

CREATE TABLE DEMO (NAME VARCHAR(20));

如果我們有一個名為 **test.txt** 的檔案,其內容如下所示:

'Raju'
'Swami'
'Deva'
'Vanaja'

以下查詢將 **test.txt** 檔案的內容載入到上面建立的表中:

load data infile "directory path/test.txt" into table DEMO;

驗證

如果您驗證 DEMO 表的內容,您可以看到其中的記錄,如下所示:

select * from DEMO;

輸出

上述 MySQL 查詢將生成以下輸出:

姓名
Raju
Swami
Deva
Vanaja

FIELDS 和 LINES 子句

使用 FIELDS 和 LINES 子句,您可以選擇需要從中載入資料的檔案中的欄位和行終止符。

示例

假設我們使用如下所示的 CREATE 語句建立了一個表:

CREATE TABLE EMPLOYEE(
   FIRST_NAME CHAR(20) NOT NULL,
   LAST_NAME CHAR(20),
   AGE INT,
   INCOME INT);

如果我們有一個名為 **data.csv** 的檔案,其內容如下所示:

Krishna,Sharma,19,2000
Raj,Kandukuri,20,7000
Ramya,Ramapriya,25,5000
Alexandra,Botez,26,2000

以下查詢將 data.csv 檔案的內容載入到上面建立的表中:

load data infile "Data Directory Path/data.csv" into table employee
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';

驗證

如果您驗證 DEMO 表的內容,您可以看到其中的記錄,如下所示:

select * from employee;

輸出

以下是上述查詢的輸出:

名字 姓氏 年齡 收入
Krishna Sharma 19 2000
Raj Kandukuri 20 7000
Ramya Ramapriya 25 5000
Alexandra Botez 26 2000

STARTING BY 子句

使用 STARTING BY 子句,您可以使用特定的字串來標記記錄或欄位的開頭。

示例

假設我們有一個文字檔案 **sample.txt**,其內容如下所示:

$Krishna,Sharma,19,2000
$Raj,Kandukuri,20,7000
$Ramya,Ramapriya,25,5000
$Alexandra,Botez,26,2000

以下查詢將上述文字檔案的內容插入到 employee 表中:

load data infile "directory path/sample.txt" into table 
employee FIELDS TERMINATED BY ',' LINES STARTING BY '$';

驗證

如果您驗證 EMPLOYEE 表的內容,您可以看到其中的記錄,如下所示:

SELECT * FROM employee;

輸出

上述 MySQL 查詢將生成以下輸出:

名字 姓氏 年齡 收入
Krishna Sharma 19 2000
Raj Kandukuri 20 7000
Ramya Ramapriya 25 5000
Alexandra Botez 26 2000

上傳檔案中的特定列

您還可以僅上傳文字檔案中的特定列值。為此,您需要在查詢中指定列名。

示例

假設我們有一個名為 **test.txt** 的文字檔案,其內容如下所示:

100,Thomas,5000
200,Jason,5500
30,Mayla,7000
40,Nisha,9500
50,Randy,6000

您需要將列名放在查詢的末尾,以下查詢將 **test.txt** 檔案的內容插入到 employee 表中:

LOAD DATA INFILE 'Directory Path/test.txt'
INTO TABLE employee
FIELDS TERMINATED BY ','
(age, first_name, income);

由於我們在檔案中沒有列 **last_name** 的值,因此該列的所有值都將為 NULL,如下所示。

SELECT * FROM EMPLOYEE;

輸出

上述查詢產生以下輸出:

名字 姓氏 年齡 收入
Thomas NULL 100 5000
Jason NULL 200 5500
Mayla NULL 30 7000
Nisha NULL 40 9500
Randy NULL 50 600

輸入預處理

在 LOAD 語句中,您可以將檔案中的值視為使用者變數,預處理它們併為其他列生成值。然後,您可以使用 SET 子句將此生成的賦值給所需的列。

示例

假設我們建立了一個名為 **test** 的表,它儲存一個人的姓名和平均分數(3 個科目),如下所示:

CREATE TABLE TEST (NAME VARCHAR(10), AVG INT);

假設我們有一個檔案,其中包含一個人的姓名和分數(所有 3 個科目),如下所示:

Radha, 25, 30, 35
Swami, 28, 36, 31
Deva, 32, 30, 29
Vanaja, 31, 24, 14

以下查詢將每個員工的分數讀取為變數,計算平均分數並將結果使用 **SET** 子句儲存在 **avg** 列中。

LOAD DATA INFILE 'Data Directory/test.txt'
   INTO TABLE test
   FIELDS TERMINATED BY ','
   (name, @m1, @m2, @m3, @avg)
   SET avg = (@m1+@m2+@m3)/3;

驗證

執行 LOAD 語句後,您可以驗證 test 表的內容,如下所示:

select * from test;

輸出

以下是上述查詢的輸出:

姓名 平均分
Radha 30
Swami 32
Deva 30
Vanaja 23
廣告