返回
如何将 CSV 数据无缝导入 MySQL 的多张表中?
mysql
2024-03-21 19:52:15
将 CSV 数据导入 MySQL 中的多张表
问题陈述
将包含五列(col1、col2、col3、date、source)的 CSV 文件导入到具有三个表的 MySQL 8.3 数据库中:
- Table1: 具有
ID
和src
列 - Table2: 具有
ID
、coll
和DateCollected
列 - Table3: 具有
ID
、column1
、column2
和column3
列
解决方案
步骤 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 文件在加载前已正确格式化。