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
广告
© . All rights reserved.