navicat 不支持直接批量导出多表为独立 sql 文件,需通过三种方式实现:① gui 内逐表使用「转储 sql 文件」;② 单表启动「数据传输」并勾选「每张表一个文件」;③ 用 mysqldump 命令行脚本自动化导出。

Navicat 批量导出多张表为独立 SQL 文件的可行路径
Navicat 本身不支持「选中 N 张表 → 一键导出为 N 个独立 .sql 文件」的原生功能。它默认的「数据传输」或「备份」操作,会把多张表合并到一个 SQL 文件里,或者只导出结构/数据但无法按表拆分。真要实现“一张表一个文件”,得绕过图形界面主流程,用导出配置+脚本辅助来达成。
用「转储 SQL 文件」功能逐表导出(最稳但需手动)
这是唯一完全在 GUI 内完成、无需外部工具的方法,适合表数量不多(比如 ≤20 张)且对命名/路径有控制需求的场景:
- 在对象浏览器中,**右键单击一张表 → 选择「转储 SQL 文件」→ 「结构和数据」**(或按需选「仅结构」「仅数据」)
- 在弹出窗口中,
文件名默认是table_name.sql,可手动改成带路径的完整路径,例如:/backup/users.sql - 勾选「导出前清空目标文件」避免追加写入;取消勾选「添加 DROP TABLE 语句」除非你明确需要(否则导入时可能报错表不存在)
- 重复该操作 —— 没有批量勾选后统一导出的入口,必须一张一张点
注意:转储 SQL 文件 生成的是标准 CREATE + INSERT 语句,兼容 MySQL / PostgreSQL(取决于当前连接类型),但不会包含 SET FOREIGN_KEY_CHECKS=0 这类安全包裹,默认不处理 AUTO_INCREMENT 值重置。
用「数据传输」配合「导出向导」导出单表(适合跨库/跨版本迁移)
如果你的目标不是存档而是迁移(比如从 MySQL 5.7 迁到 8.0),数据传输 比 转储 SQL 文件 更可控,且能自动处理字符集、引擎差异:
- 选中一张表 → 右键 → 「数据传输」→ 目标选择「结构和数据」→ 目标类型选「SQL 文件」
- 关键设置:在「高级」选项卡中,务必勾选「每张表一个文件」——这个选项只有在目标为「SQL 文件」且单表启动时才可见
-
文件名输入框支持变量,例如填/export/${TABLE_NAME}.sql,Navicat 会自动替换为实际表名(注意大小写匹配数据库实际命名) - 不支持通配符批量选表触发此流程;必须单表启动,否则「每张表一个文件」选项灰显
该方式生成的 SQL 文件默认含 CREATE TABLE IF NOT EXISTS 和 INSERT IGNORE,对重复导入更友好,但字段定义可能被重写(如 TINYINT(1) 变成 BOOLEAN)。
用命令行工具 mysqldump 替代(推荐给 30+ 表或需定时执行的场景)
Navicat 是 GUI 工具,批量自动化不是它的强项。真正高效的做法是切到终端,用 mysqldump 配合 shell 脚本:
for table in $(mysql -u root -p'pass' -Nse "SHOW TABLES FROM mydb"); do
mysqldump -u root -p'pass' mydb "$table" > "/backup/${table}.sql"
done
要点:
- 确保本地已安装 MySQL 客户端(Navicat 自带的
navicat_mysqldump不公开暴露,不可直接调用) -
-N参数禁用列名输出,-s禁用表格格式,保证SHOW TABLES返回纯表名列表 - 如果表名含特殊字符,需用反引号包裹:修改为
"\`$table\`" - Navicat 的「工具 → CLI 工具 → MySQL CLI」只能连服务器执行 SQL,不能运行系统级 for 循环
这方法导出的文件最干净,无 GUI 附加逻辑,且可加 --skip-triggers --no-create-info 等参数精细控制。但需要你有基础 shell 能力,且密码明文写在命令里存在风险(应改用 ~/.my.cnf 配置文件)。
最容易被忽略的一点:Navicat 导出的 SQL 文件默认编码是 UTF-8 **without BOM**,但 Windows 记事本打开会误判为 ANSI。如果后续要用其他工具读取(比如 Python pandas),建议用 VS Code 或 Notepad++ 确认编码,别直接双击打开再保存——一保存就可能变成 GBK 或加 BOM,导致导入失败。











