MySQL批量导入多个CSV文件
在处理大量数据时,MySQL数据库是一个非常强大而方便的工具。当我们有多个CSV文件需要导入到数据库中时,一次性导入可以大大提高效率。本文将介绍如何使用MySQL批量导入多个CSV文件,并提供相应的代码示例。
准备工作
在开始之前,我们需要确保以下几点:
- 已经安装了MySQL数据库。
- 需要导入的CSV文件已经准备好,且符合数据库表的结构要求。
- 确保MySQL服务器已经运行。
导入单个CSV文件
首先,我们先来看一下如何导入单个CSV文件到MySQL数据库中。假设我们有一个名为people.csv
的文件,包含了id
、name
和age
三个字段,我们需要将其导入到名为people
的表中。
创建表
首先,我们需要创建一个名为people
的表,用于存储CSV文件的数据。可以使用以下SQL语句在MySQL数据库中创建该表:
CREATE TABLE people (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT
);
导入CSV文件
接下来,我们使用MySQL的LOAD DATA INFILE
语句将CSV文件导入到表中。可以使用以下SQL语句导入people.csv
文件:
LOAD DATA INFILE 'people.csv'
INTO TABLE people
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
在上述语句中,LOAD DATA INFILE
用于加载CSV文件,INTO TABLE
指定了目标表,FIELDS TERMINATED BY ','
指定了字段之间的分隔符是逗号,LINES TERMINATED BY '\n'
指定了行之间的分隔符是换行符,IGNORE 1 LINES
用于忽略CSV文件中的第一行(标题行)。
批量导入多个CSV文件
现在,我们已经了解了如何导入单个CSV文件,下面我们将介绍如何批量导入多个CSV文件。
准备多个CSV文件
首先,我们需要准备多个CSV文件,这些文件应该具有相同的列头和数据结构,以便于导入到同一个表中。
假设我们有以下三个CSV文件:
people1.csv
people2.csv
people3.csv
创建表
与导入单个CSV文件相同,我们需要先创建一个表来存储这些CSV文件的数据。假设我们将使用与之前相同的人员信息表people
。
批量导入CSV文件
为了批量导入多个CSV文件,我们可以使用MySQL的LOAD DATA INFILE
语句结合循环和动态SQL来实现。
以下是一个示例代码,假设我们将多个CSV文件存储在同一个目录下,并按照文件名的顺序来进行导入:
SET @dir = '/path/to/csv/files/';
SET @sql = '';
SET @delimiter = ',';
SELECT GROUP_CONCAT(
CONCAT(
'LOAD DATA INFILE \'', @dir, filename, '\' ',
'INTO TABLE people ',
'FIELDS TERMINATED BY \'', @delimiter, '\' ',
'LINES TERMINATED BY \'\\n\' ',
'IGNORE 1 LINES;'
)
SEPARATOR ' '
) INTO @sql
FROM (
SELECT CONCAT('\'', @dir, filename) AS filename
FROM (
SELECT CONCAT('people', ROW_NUMBER() OVER ()) AS filename
FROM information_schema.tables
WHERE table_name = 'people'
) AS filenames
UNION ALL
SELECT CONCAT('\'', @dir, filename) AS filename
FROM (
SELECT CONCAT('people', ROW_NUMBER() OVER ()) AS filename
FROM information_schema.tables
WHERE table_name = 'people'
) AS filenames
) AS filenames;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
在上述代码中,我们首先定义了一个变量@dir
,用于指定CSV文件所在的目录。然后,我们使用动态SQL来生成一组LOAD DATA INFILE
语句,并将其存储在变量@sql
中。最后,我们使用PREPARE
语句来准备执行动态SQL,并使用`EXEC