如何使用mysql实现批量导入数据_mysql批量导入实战

3次阅读

mysql批量导入数据最高效方式是LOAD DATA INFILE,需文件字段匹配、UTF-8无bom编码、置于secure_file_priv目录;支持字段映射与错误处理,替代方案为mysqlimport命令。

如何使用mysql实现批量导入数据_mysql批量导入实战

MySQL批量导入数据最常用、最高效的方式是使用LOAD DATA INFILE语句,配合格式规范的文本文件(如CSV或TSV)。它比逐条INSERT快数十倍甚至上百倍,特别适合一次性导入万级、百万级数据。

准备结构匹配的文本文件

确保文件字段顺序、类型、分隔符与目标表完全一致。常见要求如下:

  • 每行一条记录,字段间用逗号(或制表符)分隔,行末无多余空格
  • 字符串字段建议用双引号包裹,避免含逗号或换行导致解析错误
  • 日期用YYYY-MM-DD格式,NULL值可写为N或留空(需在SQL中指定SET col = NULLIF(@col, '')
  • 文件保存为UTF-8无BOM编码,避免中文乱码

启用并执行LOAD DATA INFILE

该命令默认可能被禁用,需确认MySQL配置:

  • 检查secure_file_priv路径:SHOW varIABLES LIKE 'secure_file_priv';,只能从该目录下读取文件
  • 把数据文件(如users.csv)放到该路径下,例如/var/lib/mysql-files/
  • 执行导入(以逗号分隔、首行为字段名为例):

LOAD DATA INFILE ‘/var/lib/mysql-files/users.csv’
  INTO table users
  FIELDS TERMINATED BY ‘,’
  OPTIONALLY ENCLOSED BY ‘”‘
  LINES TERMINATED BY ‘n’
  IGNORE 1 ROWS;

处理常见问题与增强控制

遇到报错时,优先排查编码、路径权限和字段映射:

  • 若提示“File not found”,检查文件是否真在secure_file_priv目录,且MySQL进程有读取权限
  • 若中文乱码,建表时用CHARSET=utf8mb4,并在LOAD前执行SET NAMES utf8mb4;
  • 需跳过重复主键或唯一键冲突?加ON DUPLICATE KEY UPDATE逻辑,但LOAD DATA本身不支持,可改用INSERT IGNORE配合脚本生成SQL,或先清空再导入
  • 字段数不匹配?可用SET子句做映射,例如SET created_at = STR_TO_DATE(@date_str, '%Y-%m-%d')

替代方案:mysqlimport命令行工具

它是LOAD DATA INFILE封装,适合运维场景:

  • 语法简洁:mysqlimport --local --fields-terminated-by=',' --lines-terminated-by='n' --ignore-lines=1 -u root -p db_name /path/to/users.csv
  • 自动匹配表名(文件名去掉扩展名即表名),支持并发导入多个文件
  • 注意加--local参数,并确保MySQL服务端启用了local_infile=ON
text=ZqhQzanResources