如何用MySQL循环批量创建同结构表并导入本地CSV数据?
MySQL循环创建同结构表并批量导入CSV的存储过程实现
存储过程代码
以下是适配A1-A20表名及对应CSV文件的批量操作存储过程:
DELIMITER // CREATE PROCEDURE BatchCreateTablesAndImport() BEGIN DECLARE i INT DEFAULT 1; DECLARE table_name VARCHAR(50); DECLARE csv_path VARCHAR(255); WHILE i <= 20 DO -- 生成当前循环的表名(如A1、A2...A20) SET table_name = CONCAT('A', i); -- 拼接对应CSV文件的绝对路径,替换为你的实际路径 SET csv_path = CONCAT('/your/csv/storage/path/A', i, '.csv'); -- 复制表A的结构创建新表(IF NOT EXISTS避免重复创建报错) SET @create_sql = CONCAT('CREATE TABLE IF NOT EXISTS ', table_name, ' LIKE A'); PREPARE create_stmt FROM @create_sql; EXECUTE create_stmt; DEALLOCATE PREPARE create_stmt; -- 构造导入数据的SQL,根据CSV实际格式调整参数 SET @load_sql = CONCAT( 'LOAD DATA LOCAL INFILE ''', csv_path, ''' ', 'INTO TABLE ', table_name, ' ', 'FIELDS TERMINATED BY '','' ', -- CSV字段分隔符,默认逗号,按需修改 'OPTIONALLY ENCLOSED BY ''"'' ', -- 若字段带双引号包裹,保留此句 'LINES TERMINATED BY ''\n'' ', -- 行分隔符,Windows环境换成'\r\n' 'IGNORE 1 LINES' -- 若CSV第一行是表头则忽略,无表头则删除此句 ); PREPARE load_stmt FROM @load_sql; EXECUTE load_stmt; DEALLOCATE PREPARE load_stmt; SET i = i + 1; END WHILE; END // DELIMITER ;
执行存储过程
存储过程创建完成后,直接调用即可启动批量操作:
CALL BatchCreateTablesAndImport();
关键注意事项
- 开启
local_infile支持:先执行SET GLOBAL local_infile = 1;,且连接MySQL客户端时需添加--local-infile=1参数(如命令行:mysql -u your_username -p --local-infile=1) - 权限要求:执行存储过程的用户需拥有
CREATE TABLE权限、FILE权限,以及目标数据库的读写权限 - 文件路径适配:务必替换代码中的
/your/csv/storage/path/为你的CSV实际存放路径,同时保证MySQL服务进程能读取该路径下的文件(Linux下注意给mysql用户赋读权限) - CSV格式调整:根据实际CSV的分隔符、表头情况修改
LOAD DATA中的参数,比如字段用制表符分隔时,将TERMINATED BY ','改为TERMINATED BY '\t'
内容的提问来源于stack exchange,提问作者Angeles Las
相关产品推荐
相关产品推荐

