Navicat的“运行SQL文件”功能不支持跳过错误,遇ERROR(如1062、1054、1366)即终止执行;容错执行必须改用“导入向导”并勾选“出错后继续”,且仅对数据库报错有效,不处理语法、编码或解析问题。
“运行 SQL 文件”功能根本不支持跳过错误
navicat 的「运行 sql 文件」(run sql file)功能没有“出错后继续”或“忽略错误”的勾选项——这不是你没找到,是它压根不提供。一旦某条语句执行失败(比如 error 1062 主键重复、error 1054 字段不存在、error 1366 字符集不匹配),整个执行流程立即终止,后续所有语句都不会进入解析或执行阶段。
常见误判场景:
- 脚本里有
DROP TABLE IF EXISTS,但表根本不存在 → 报ERROR 1051后,后面的CREATE TABLE就被静默跳过 - 开头写了
USE my_db;,但目标连接默认数据库不是my_db且该库不存在 → 整个脚本卡在第一行,后面全不执行 - SQL 文件含
GO分隔符(来自 SQL Server)→ Navicat MySQL 连接直接把GO当非法 token 丢弃,后续语句因缺失上下文(如未USE)而批量失败
真正能跳过错误的只有“导入向导”
如果你需要容错执行,必须放弃「运行 SQL 文件」,改用「导入向导」(Import Wizard)——但仅限特定文件类型和路径:
- 对 SQL 文件:导入向导第 2 步(“运行查询”页)必须手动勾选
Continue after error(中文版叫「出错后继续」) - 对 TXT/CSV:导入向导第 3 步点击
Options按钮,勾选Skip records with errors - 对 Access:同样在 Options 里勾选
跳过含有错误的记录和继续导入其余记录 - 对 DBF:必须先选择目标为「已存在表」并勾选
Insert data,Options按钮才会激活
注意:Continue after error 只影响 SQL 执行阶段的数据库报错,对语法错误、编码乱码、分隔符识别失败等解析层问题完全无效。
为什么 SET FOREIGN_KEY_CHECKS=0 也救不了你
关掉外键检查只解决一种错误:子表插入时父表 ID 不存在(ERROR 1452)。但它对以下高频错误毫无作用:
-
ERROR 1062:主键/唯一键冲突 → 需改用INSERT IGNORE或ON DUPLICATE KEY UPDATE,Navicat 不会自动帮你重写 SQL -
ERROR 1054:字段名不存在 → 源库和目标库 schema 不一致,比如大小写敏感(namevsName)或字段被删了 -
ERROR 1366:字符集不匹配 → 文件是 GBK 编码,但 Navicat 以 UTF-8 读取,导致引号、分号、注释符全部错位 -
ERROR 1064:语法错误 → 常见于多行注释未闭合(/*开头但无*/)、字符串里含未转义单引号、或混用了 PostgreSQL 的ILIKE
检查当前执行模式最直接的办法
别猜,直接看 Navicat 界面右下角状态栏或执行日志末尾:
- 如果显示
已执行 3 个查询,但脚本有 15 条语句 → 大概率是前 3 条之后某条报错中断,后续被跳过 - 如果日志里出现
Query interrupted或Execution stopped→ 确认是「运行 SQL 文件」模式,此时无需检查设置,因为该模式无容错开关 - 如果弹窗摘要写
成功导入 1284 条,跳过 7 条→ 说明你走的是导入向导 +Continue after error路径
复杂点在于:同一份 SQL 文件,在「导入向导」里能跳过,在「运行 SQL 文件」里就彻底失败——两者底层调用的驱动和错误处理逻辑完全不同,不能互相替代。











