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';
以下是上述查询的输出:-
Variable_name | Value |
---|---|
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 查询将生成以下输出 -
NAME |
---|
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 ' ';
验证
如果您验证 DEMO 表的内容,您可以观察到其中的记录如下:-
select * from employee;
输出
以下是上述查询的输出:-
FIRST_NAME | LAST_NAME | AGE | INCOME |
---|---|---|---|
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 查询生成以下输出:-
FIRST_NAME | LAST_NAME | AGE | INCOME |
---|---|---|---|
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;
输出
上述查询产生以下输出 -
FIRST_NAME | LAST_NAME | AGE | INCOME |
---|---|---|---|
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 语句后,您可以验证测试表的内容,如下所示 -
select * from test;
输出
以下是上述查询的输出 -
NAME | AVG |
---|---|
Radha | 30 |
Swami | 32 |
Deva | 30 |
Vanaja | 23 |