navicat「运行 sql 文件」不支持跳过错误,因该功能为纯文本流执行器,mysql报错即中断;“出错后继续”仅存在于「导入向导」第二步中,且对error 1062、1054、1366等无效;可靠容错需用mysql --force命令行或预处理sql。
navicat 的「运行 sql 文件」功能压根不支持跳过错误——你看到的“遇到错误继续”选项根本不存在于这个界面里。这是最常被误导的操作前提。
为什么「运行 SQL 文件」里找不到“忽略错误”开关
Navicat 的「运行 SQL 文件」是纯语句执行器,它把整个文件当作文本流逐行送进 MySQL,一旦某条语句报错(比如 ERROR 1062 或 ERROR 1054),MySQL 默认回滚并中断会话,Navicat 不会捕获、重试或跳过,更不会提供勾选框。所谓“忽略错误”只存在于另一个路径里:
- 必须使用「导入向导」:右键数据库 →「导入向导」→ 选择 SQL 文件 → 第二步「运行查询」页 → 勾选
Continue after error(中文版叫「出错后继续」) - 「运行 SQL 文件」窗口里无论怎么翻「高级」「选项」「设置」,都没有该复选框——这不是 UI 隐藏,是功能缺失
- 如果你已经点了「运行 SQL 文件」并卡在第 874 行报错,此时无法中途开启跳过,只能中止、换路径
导入向导里勾选了「出错后继续」还是停住?检查错误类型
这个选项只对 MySQL 层面可恢复的执行错误生效,不是万能跳过键。它对以下错误完全无效:
-
ERROR 1062(主键/唯一键重复):MySQL 认为这是业务逻辑冲突,不是语法或连接问题,Continue after error不起作用 -
ERROR 1054(Unknown column):字段名不存在,说明 schema 不匹配,向导无法自动修复 -
ERROR 1366(Incorrect string value):字符集解码失败,发生在语句解析前,根本没走到执行环节 - SQL 文件开头有
CREATE DATABASE或USE xxx:Navicat 导入向导强制在当前选定库下执行,这类语句直接被拒绝
真正想让 SQL 文件“一路到底”,得绕开 Navicat GUI
命令行才是可控的底层入口,且支持明确的容错参数:
- 用
mysql --force -u root -p target_db :--force 会让客户端跳过单条错误继续送下一条 - 如果目标库已存在且结构一致,加
--insert-ignore参数导出源库(用 mysqldump),比在 Navicat 里硬扛更干净 - 临时关闭严格模式:在命令行导入前加
SET SESSION sql_mode = '';,可避免'0000-00-00'类零日期报错 - 大文件建议拆分:用
split -l 5000 data.sql chunk_分片,再配合 shell 循环导入,失败时定位更快
别依赖 Navicat 界面里的“高级选项”幻觉。它对 SQL 文件的控制粒度很粗,真正要稳、要跳、要调试,得回到命令行或提前清洗 SQL 内容——比如删掉 USE、统一编码、替换 INSERT INTO 为 INSERT IGNORE INTO。这些动作看起来麻烦,但比反复点「确定」然后看报错强得多。











