Navicat新建表默认落在search_path首个有效schema中,如"$user", public则优先建在同名schema(如crm_user),analytics, public则建在analytics;需执行SHOW search_path验证,且建表位置由当前会话search_path决定。
Navicat 新建表时 Schema 落在哪,由 search_path 决定
navicat 里点“新建表”根本不会弹出 schema 选择框——它完全不问你,只认当前连接的 search_path。你看到表“消失”或“建错地方”,90% 是因为 search_path 和你预期不符。
执行 SHOW search_path; 看输出,常见情况有:
-
"$user", public:登录用户名是crm_user,就优先往crm_userschema 建(前提是该 schema 存在) -
analytics, public:建表语句没写 schema,等价于CREATE TABLE analytics.users - 只有
public却提示schema "public" does not exist:这个库的publicschema 被手动删过(少见但真有)
想让 Navicat 默认建进 analytics schema,必须改 search_path
界面里没有开关,只能靠 SQL 设置。最直接的办法是连接成功后,立刻在查询窗口执行:
SET search_path TO analytics, public;
这条命令只对当前会话有效,关掉连接就失效。如果想永久生效,得改用户级配置:
ALTER ROLE your_user SET search_path TO analytics, public;
注意两点:
- 顺序很重要:
analytics在前,public在后,否则新建表还是落到public -
your_user要替换成你实际连接用的用户名,比如app_user
Navicat 对象树不显示自定义 Schema?不是没建,是默认隐藏
哪怕 analytics schema 已存在、且里面有表,Navicat 对象浏览器也可能不展开它——这不是 bug,是默认策略。
解决办法分三步:
- 右键连接 → “刷新”(强制重载 schema 列表)
- 菜单栏「工具」→「选项」→「对象过滤器」→ 勾选「显示所有 Schema」
- 仍不显示?先确认 schema 真的存在:
SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'analytics';
别信“新建模式”对话框点了“确定”就完事——Navicat 这个操作需要你再点一次“保存”或按 Ctrl+S 才真正提交,否则只是 UI 上的假动作。
Schema 所属关系不能“可视化设置”,但可以验证和修正
所谓“Schema 所属关系”,本质是表属于哪个 schema,而这个归属在建表时就固定了(除非用 ALTER TABLE ... SET SCHEMA)。Navicat 不提供拖拽式归属调整,但能帮你看清现状:
- 右键某张表 → 「设计表」→ 表名上方显示完整路径,如
analytics.users,说明它属于analytics - 右键 schema(比如
analytics)→ 「刷新」→ 看里面有没有你期望的表 - 查系统视图确认:
SELECT table_schema, table_name FROM information_schema.tables WHERE table_name = 'users';
最容易被忽略的是:Navicat 的“新建模式”功能不校验权限,如果你用的账号没有 CREATE 权限,点再多下确定也建不出 schema,还不会报错——得去查 PostgreSQL 日志或手动执行 CREATE SCHEMA analytics; 看是否报 permission denied。











