Navicat 15 无法通过「转储SQL文件」界面直接限定单个 Schema,需改用「导出向导」:展开目标 Schema → 全选其下表 → 右键选「导出向导」→ 选 SQL 格式并勾选「导出 USE 语句」;PostgreSQL 用户应优先使用命令行 pg_dump 配合 --schema 参数确保精准导出。
Navicat 15 转储时怎么限定只导出某个 Schema 下的表
navicat 15 的「转储sql文件」功能本身不直接暴露「schema 选择器」,它默认按当前连接的数据库(即默认 schema)操作。如果你用的是 mysql,那通常没有显式 schema 概念,database 就是 schema;但如果是 postgresql 或 sql server,一个连接可能对应多个 schema,此时右键数据库 →「转储sql文件」会导出整个连接下所有可访问的 schema 中的表,**无法通过界面勾选限定单个 schema**。
真正能控制 schema 范围的方式,是绕过「转储」,改用「导出向导」+ 手动筛选表:
- 在对象列表中展开目标数据库,再展开
SCHEMAS(PostgreSQL)或Schemas(SQL Server),找到你要的那个 schema 名称(比如public或sales) - 点击该 schema 旁的三角展开,全选里面的所有表(Ctrl+A 或鼠标拖选)
- 右键 → 「导出向导」→ 格式选「SQL 文件」→ 在「导出选项」页勾选「仅导出表结构」或「结构和数据」
- 关键一步:取消勾选「导出创建数据库语句」和「导出删除语句」,避免生成跨 schema 的
DROP DATABASE或误删其他 schema 对象
为什么右键数据库点「转储SQL文件」会导出错 schema 的表
因为 Navicat 15 的「转储SQL文件」底层调用的是数据库原生命令(如 mysqldump、pg_dump),但它把连接参数直接传给工具,而没透传 --schema=xxx 这类参数。尤其在 PostgreSQL 中,如果你连接时未指定 options=-c search_path=xxx,pg_dump 就会默认 dump 所有属于当前用户有权限的 schema,不只是你看到的那个。
常见错误现象包括:
- 导出的 SQL 里出现
CREATE TABLE other_schema.table_xxx,但你根本没选那个 schema - 导入时提示
schema "other_schema" does not exist - 文件体积远超预期——实际混入了其他 schema 的视图或函数定义
导出 PostgreSQL 单 schema 的安全做法(带 --schema 参数)
如果必须用「转储」且要精确控制 schema,唯一可靠方式是跳过图形界面,改用命令行 + Navicat 内置的 CLI 工具路径:
先确认 Navicat 安装目录下的 pg_dump 位置(通常是 C:\Program Files\PremiumSoft\Navicat Premium 15\pg_dump.exe),然后手动执行:
pg_dump.exe -h your_host -U your_user -p 5432 -d your_db --schema=public --no-owner --no-privileges --clean --if-exists -f "public_schema.sql"
注意几个关键参数:
-
--schema=public:强制只 dump 指定 schema,忽略其他 -
--no-owner和--no-privileges:避免导出ALTER TABLE OWNER类语句,防止导入时权限报错 -
--clean --if-exists:生成的 SQL 包含DROP TABLE IF EXISTS,但不会删 schema 本身
这个命令导出的文件,才是严格限定在单 schema 内的干净结构+数据。
MySQL 用户注意:database 就是 schema,但别漏掉 USE 语句
MySQL 没有独立 schema 概念,database 等价于 schema。但 Navicat 15 在「转储SQL文件」时,默认不写 USE `db_name`; 开头,导致导入时如果当前 database 不匹配,表会被建到错误库下。
解决办法很简单,在导出后打开 SQL 文件,手动在第一行插入:
USE `your_database_name`;
或者更稳妥的做法:导出时在「导出向导」的「高级选项」页勾选「导出 USE 语句」——这个选项在「转储」界面里是没有的,只有「导出向导」才有。
容易被忽略的一点:如果目标 MySQL 服务器开启了 sql_mode=STRICT_TRANS_TABLES,而导出的 SQL 里有 0000-00-00 日期值,导入会失败。这时得在导出前临时修改 session mode,或导出后用文本工具全局替换掉非法日期。











