Navicat新建表默认建在search_path首个schema中,通常是public;若search_path含"$user"且同名schema存在,则建在该用户schema下。
Navicat 新建表默认建在哪?
不手动干预,create table 语句会落在 search_path 第一个 schema 中——通常是 public,但不是绝对。如果当前用户是 crm_user,且 search_path 包含 "$user",那表就会建在 crm_user schema 下(前提是该 schema 存在)。
常见误判点:
- 在 Navicat 对象树里没看到
public,不等于它不存在;可能是被折叠或过滤了 - 执行
SHOW search_path;后输出是"$user", public,但建表失败提示schema "crm_user" does not exist→ 说明该 schema 没创建过,不是权限问题 - 建完表却查不到:先确认你连的是哪个数据库、哪个用户,再查
SELECT schemaname, tablename FROM pg_tables WHERE tablename = 'your_table';
在 Navicat 界面里怎么选 Schema?
不能选。Navicat 的“新建表”对话框里没有 Schema 下拉菜单,它完全依赖当前连接的 search_path。所谓“可视化建表”,只是图形化填写字段、类型、约束,底层仍走默认路径。
想让表建进 analytics 而不是 public,必须提前设置路径:
- 临时生效:在 Navicat 查询窗口执行
SET search_path TO analytics, public;,之后所有未显式指定 schema 的建表操作都会落在analytics - 永久生效(推荐):
ALTER ROLE your_user SET search_path TO analytics, public;,下次登录即生效 - 注意顺序:
analytics必须排在public前面,否则CREATE TABLE users仍会解析为public.users
对象树里看不到自定义 Schema 怎么办?
不是 Schema 没创建,而是 Navicat 默认隐藏非 public 且为空的 schema。
解决步骤:
- 右键数据库节点 → “刷新”,不是右键空白处或 schema 节点
- 检查是否真存在:
SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'analytics'; - Navicat 17+:菜单栏 → “工具” → “选项” → “对象过滤器” → 勾选“显示所有 Schema”
- 用“新建模式”功能时,填完名字必须点“确定”并提交(有些版本需额外点击“保存”图标),否则只停留在 UI 层面
显式指定 Schema 比依赖 search_path 更可靠吗?
是,尤其在脚本自动化或多人协作场景下。界面建表无法控制 schema,但你可以事后用 SQL 修改或迁移:
- 把表从
public移到analytics:ALTER TABLE public.users SET SCHEMA analytics; - 建表时直接写全名:
CREATE TABLE analytics.users (id SERIAL);—— 这条语句不受search_path影响 - 团队共用 Navicat 连接配置时,
search_path容易被某人临时修改而引发意外,显式声明更可预期
真正容易被忽略的点:Navicat 的“新建表”操作一旦完成,就再无 Schema 修正入口——它不会弹出确认框,也不会在对象树里高亮新 schema。你得自己去查、去刷新、去验证,而不是凭视觉判断成功与否。











