navicat 不支持定时导入 csv,因其无内置计划任务功能;所有所谓“定时导入”均需借助外部调度工具或数据库原生命令实现。
navicat 本身不支持“定时导入 csv”——它没有内置的计划任务功能来反向执行导入操作。 所有声称“navicat 定时导入”的方案,本质都是绕过 navicat 的 gui,用外部调度(如 windows 任务计划 + 命令行)驱动其导入逻辑,或改用数据库原生命令(如 load data infile)配合系统定时器。直接在 navicat 界面里找不到“新建导入计划”按钮,不是你没找到,是它根本不存在。
为什么 Navicat 导入不能像导出那样设计划任务
Navicat 的「计划任务」模块只封装了 Export 流程(导出向导),不包含 Import。导入操作被设计为交互式行为:需人工选择文件、映射字段、确认编码等,这些步骤无法被预存为可重复调用的任务模板。即使你录下操作过程,Navicat 也不会生成可调度的 .job 或 .xml 配置。
- 导出任务能保存,是因为导出参数(SQL、路径、格式、编码)相对固定,且不依赖文件系统实时状态
- 导入必须每次指定 CSV 文件路径,而该路径若含日期变量(如
data_20260728.csv),Navicat 导入向导根本不解析变量语法——变量仅在导出向导的「文件名」栏生效 - 导入过程可能触发字段映射冲突、空值处理异常、字符集不匹配等交互性报错,GUI 会弹窗阻塞,命令行模式下则直接失败退出
可行替代方案:Windows 任务计划 + Navicat CLI(仅限 Premium 16+)
Navicat Premium 16 及以上版本提供了命令行工具 ncli.exe,支持导入,但限制极多:
- 必须提前在 Navicat 中完整配置好一次导入任务,并保存为
.nimport文件(通过「导入向导 → 最后一步 → 保存配置」) -
.nimport文件绑定的是绝对路径下的**特定 CSV 文件**,不支持通配符或变量;若每天换文件,就得每天重生成该配置文件 - 执行命令形如:
ncli.exe -import "C:\path\to\config.nimport",需确保运行账户已登录且 Navicat 连接可用 - 若目标库需密码,且连接配置启用了密码保存,则任务必须设为「仅当用户登录时运行」,否则凭据不可见,导入静默失败
该方式脆弱:CSV 文件缺失、路径权限不足、ncli.exe 被杀软拦截、Navicat 后台进程未响应,都会导致无日志、无通知、无重试。
更可靠的做法:绕过 Navicat,用数据库原生命令 + 系统定时器
对 MySQL/MariaDB,直接用 LOAD DATA INFILE 配合 Windows 任务计划或 Linux cron,稳定性和可控性远高于 Navicat CLI:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 写一个批处理(
.bat)或 Shell 脚本,先用curl或robocopy把当天 CSV 拉到 MySQL 服务端可读路径(如C:\mysql\upload\),再调用mysql -e "LOAD DATA INFILE 'upload/data_20260728.csv' ..." - SQL 中必须显式指定
FIELDS TERMINATED BY ','、ENCLOSED BY '"'、LINES TERMINATED BY '\r\n',否则 Windows 生成的 CRLF 行尾会导致最后一列错位 - 编码必须匹配:CSV 是 UTF-8 with BOM?MySQL 表用
utf8mb4?那语句末尾得加CHARACTER SET utf8mb4 - 为防重复导入,可在脚本开头加 SQL 判断:
DELETE FROM target_table WHERE import_date = CURDATE(),再 LOAD
PostgreSQL 对应用 COPY FROM;SQL Server 用 BULK INSERT。核心逻辑一致:把“调度”和“执行”解耦,让定时器管时间,让数据库引擎管数据。
最容易被忽略的点:CSV 文件就绪时机与锁竞争
即使脚本写对了,也常在凌晨 2 点失败——因为上游系统导出 CSV 的任务还没结束,你的导入脚本已开始读一个正在被写的半截文件。这不是 Navicat 的问题,而是所有定时导入共有的竞态条件:
- 不要依赖文件名存在即代表就绪;应在 CSV 写完后,由上游生成一个同名
.done标记文件,脚本先检查该标记再执行 - 避免在业务高峰期导入大表,否则
LOAD DATA INFILE会持表级锁(MySQL MyISAM)或长事务(InnoDB),拖慢线上查询 - 如果导入目标表有唯一键或外键约束,错误数据会中断整个批次;建议先导到临时表,清洗校验后再
INSERT INTO ... SELECT到主表
定时导入不是点个按钮就能跑通的流水线,它是一条需要上下游协同、带状态检查、容错重试的真实数据链路。Navicat 在这里只是个配置参考工具,别把它当调度中枢。










