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

来源:这里教程网 时间:2026-02-28 20:48:32 作者:

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

相关推荐