Navicat 不支持真正批量执行多个.sql文件,所谓“批量”实为合并成单文件后执行;多选仅首文件生效,因底层只取列表首项,其余静默忽略。
navicat 本身不支持“选中多个 .sql 文件 → 一键执行”,所谓“批量还原大量小 sql 文件”,本质是把它们合并成一个逻辑单元再运行——不是功能开关能打开的,而是靠文件预处理 + 正确调用方式实现的。
为什么右键“执行SQL文件”多选后仍只跑第一个
很多人误以为按住 Ctrl 多选就能批量执行,结果只有第一个文件生效。这是因为 Navicat 的「执行SQL文件」对话框虽允许多选,但底层只取列表首项传给执行引擎;其余文件被静默忽略,连错误提示都没有。
- 必须右键点击的是数据库连接(如
127.0.0.1:3306)或具体数据库名(如myapp_dev),而不是表、视图或查询标签页 - 多选时文件按字母序排列,无法手动调整顺序;若依赖强(如
01_schema.sql必须在02_data.sql前),就得重命名确保排序正确 - Navicat 不校验后续文件是否存在语法错误,它根本没读到——所以别指望“失败提示”帮你定位问题
合并文件前必须清理的三个硬性细节
直接 cat *.sql > all.sql 或拖进编辑器粘贴,大概率执行失败。常见卡点不在 SQL 逻辑,而在编码、分隔符和会话状态。
-
SET NAMES utf8mb4在 MySQL 8.0+ 下可能被拒绝:改用SET NAMES utf8mb4 COLLATE utf8mb4_0900_as_cs,与 Navicat 当前连接的排序规则对齐 - Windows 记事本保存的 .sql 文件常带 BOM:用 VS Code 打开 → 右下角点击编码 → 选「Save with Encoding」→
UTF-8(不是UTF-8 with BOM) - 每个文件末尾检查是否有多余
DELIMITER $$未配对:必须补上DELIMITER ;,否则合并后下一段语句会被当作文本字面量吞掉
在 Navicat 里执行合并文件时的关键勾选项
即使文件已合并、编码已修正,执行窗口里的两个勾选项仍决定成败。它们不显眼,但影响解析行为和容错能力。
- 勾选「遇到错误继续」:让 Navicat 遇到
DROP TABLE IF EXISTS报错(表不存在)时不中断,适合初始化场景;但注意它不会跳过语法错误,只跳过运行时错误 - 勾选「每个运行中运行多重查询」:这是关键——不勾它,Navicat 会把整个文件当一条语句执行(尤其当文件里有空行或注释换行时),导致
Query OK, 0 rows affected刷屏却无建表 - 不要勾「停止执行遇到错误时」:这个选项默认开启,会一报错就停;批量还原结构时建议关闭,否则一个
CREATE INDEX失败就卡住,后面的数据插入全废
怎么知道哪个小文件出错了
合并执行后报错,你得快速定位是哪个原始文件的问题。Navicat 不显示文件名,只报行号,而合并后行号已失真。
- 在每个原始文件开头加一行标记:例如
-- === [01_init.sql] ===,用双破折号+空格+方括号,Navicat 不会执行它,但日志里能看到上下文 - 避免用
/* === file.sql === */这种块注释:如果前面文件漏了*/,会导致整段被注释掉,静默失败 - 执行前先在 Navicat 查询窗口里粘贴合并后的内容,按
Ctrl+Shift+Enter手动试跑前 20 行——这比直接点「开始」更容易捕获早期语法问题
真正麻烦的不是合并操作本身,而是各文件隐含的会话依赖:比如某个文件里设了 @var := 1,下一个文件想用,但 Navicat 批量执行时未必复用同一 session;这种跨文件变量传递不可靠,得提前转成建临时表或写入配置表的方式处理。











