navicat 不支持批量执行多个 .sql 文件,仅能单文件运行且易静默失败;可靠方案是用 psql 命令行配合 shell 循环执行,注意事务隔离、编码统一、跨库拆分及错误中断机制。
navicat 里批量执行多个 .sql 文件根本不行
navicat 没有“选中多个文件 → 一键执行”的功能,所谓“批量执行 sql 文件”其实是用户误把「执行单个含多语句的文件」或「用外部脚本调度」当成了内置能力。它只支持一次打开并运行一个 .sql 文件,且遇到 create database、set 或跨库语句时容易静默失败。
真正能批量跑多个 .sql 文件的只有命令行 + psql
PostgreSQL 原生命令行工具 psql 才是批量执行的可靠路径,尤其适合 CI/CD、本地初始化或迁移场景。关键不是“怎么点”,而是“怎么组织命令和路径”。
-
psql支持-f参数指定单个文件,但不支持-f *.sql这种通配符写法 - 必须用 shell 循环,比如:
for f in ./migrations/*.sql; do psql -U postgres -d mydb -f "$f"; done
- 加
-v ON_ERROR_STOP=1让任意一条 SQL 报错就中断,避免后续文件继续执行 - 如果文件里含
\c otherdb或CREATE DATABASE,得拆成不同psql调用——因为psql不会在同一个会话里跨库执行
Navicat 用户想“假装批量”,只能靠文件合并 + 手动分段
如果你非得在 Navicat 里操作,唯一可行办法是把多个 .sql 文件内容按顺序拼成一个大文件,再手动插入分隔标记(如 -- === file: init_users.sql ===),方便出错时定位。但这不是批量执行,只是“合并在一个窗口里点一次”。
- 合并时注意编码统一,Windows 下记事本保存的
.sql常带 BOM,psql会报ERROR: unrecognized configuration parameter "SET" - Navicat 默认用当前连接的数据库执行全部语句,不会自动切换
SET search_path或跳过CREATE SCHEMA IF NOT EXISTS等语句 - 含
COPY的文件在 Navicat 中基本跑不通,因为COPY是服务端路径,而 Navicat 发的是客户端psql\copy协议,得换成\COPY(仅psql支持)
别忽略事务边界和依赖顺序
多个 SQL 文件之间往往有强依赖,比如先建表、再插数据、最后建索引。但 psql -f a.sql && psql -f b.sql 并不等于“整个流程在一个事务里”,每个文件都是独立事务。一旦中间出错,回滚不了前面已提交的文件。
- 需要原子性时,必须把所有语句合并进一个文件,并用
BEGIN; ... COMMIT;包裹(注意:DDL 如CREATE TABLE在 PostgreSQL 中会隐式提交,无法回滚) - Navicat 的“执行当前查询”按钮对多语句支持有限,遇到空行或注释后换行可能截断执行,建议关掉
Tools → Options → SQL Editor → “Ignore execution of statements after first error” - 真正的生产级批量部署,应该用
pg_restore(对应pg_dump -Fc输出)或专用迁移工具如flyway、liquibase,而不是拼 SQL 文件
事情说清了就结束。











