返回

如何将 CSV 数据无缝导入 MySQL 的多张表中?

mysql

将 CSV 数据导入 MySQL 中的多张表

问题陈述

将包含五列(col1、col2、col3、date、source)的 CSV 文件导入到具有三个表的 MySQL 8.3 数据库中:

  • Table1: 具有 IDsrc
  • Table2: 具有 IDcollDateCollected
  • Table3: 具有 IDcolumn1column2column3

解决方案

步骤 1:创建表

创建一个与 CSV 文件中列结构匹配的表架构:

CREATE TABLE Table1 (
    ID INT NOT NULL AUTO_INCREMENT,
    src VARCHAR(255) NOT NULL,
    PRIMARY KEY (ID)
);

CREATE TABLE Table2 (
    ID INT NOT NULL AUTO_INCREMENT,
    coll VARCHAR(255) NOT NULL,
    DateCollected DATE NOT NULL,
    PRIMARY KEY (ID)
);

CREATE TABLE Table3 (
    ID INT NOT NULL AUTO_INCREMENT,
    column1 VARCHAR(255) NOT NULL,
    column2 VARCHAR(255) NOT NULL,
    column3 VARCHAR(255) NOT NULL,
    PRIMARY KEY (ID)
);

步骤 2:加载数据

使用 LOAD DATA INFILE 命令将 CSV 文件加载到表中:

-- 加载到 Table1
LOAD DATA INFILE '/path/to/testTripsForDB.csv'
INTO TABLE Table1
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(src);

-- 加载到 Table2
LOAD DATA INFILE '/path/to/testTripsForDB.csv'
INTO TABLE Table2
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(coll, DateCollected);

-- 加载到 Table3
LOAD DATA INFILE '/path/to/testTripsForDB.csv'
INTO TABLE Table3
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(column1, column3, column2);

步骤 3:处理列顺序

由于 Table3 中列的顺序与 CSV 文件中不同,需要更新列顺序:

ALTER TABLE Table3 MODIFY COLUMN column2 VARCHAR(255) AFTER column1;

步骤 4:验证数据

使用 SELECT 语句检查数据是否正确导入:

SELECT * FROM Table1;
SELECT * FROM Table2;
SELECT * FROM Table3;

结论

通过遵循这些步骤,您可以成功地将 CSV 数据导入具有多张表的 MySQL 数据库中。此方法可以用于广泛的数据导入场景,并有助于优化数据管理和分析流程。

常见问题解答

1. 如何映射 CSV 列到表列?

LOAD DATA INFILE 命令中使用括号指定映射,列出 CSV 列的顺序以及它们应该映射到的表列。

2. 如何处理数据类型不匹配?

确保 CSV 文件中的数据类型与表中定义的数据类型兼容。例如,日期应为 DATE 或 DATETIME 格式。

3. 如何忽略 CSV 文件中的标题行?

使用 IGNORE 1 ROWS 选项跳过 CSV 文件中的第一行(标题行)。

4. 如何处理包含空值的 CSV 文件?

在加载数据之前,使用 COALESCE 或其他函数处理空值,以避免插入无效数据。

5. 如何优化导入性能?

使用 CONCURRENT=n 选项启用并发加载,LINES TERMINATED BY 指定行分隔符,并确保 CSV 文件在加载前已正确格式化。