Navicat新建表默认建在search_path首个schema中,通常是public;若search_path含$user(如crm_user),则优先建在同名schema;需执行SHOW search_path验证。
Navicat里新建表时默认建在哪?
不手动指定 schema,create table 语句会落在 public 模式下——这是 postgresql 的默认搜索路径起点。但如果你在 navicat 中没看到 public,或者建完表查不到,大概率是 search_path 被改过,或你连的用户默认 schema 不是 public。
验证方法:在 Navicat 查询窗口执行 SHOW search_path;,输出类似 "$user", public 或 analytics, public 就说明当前路径已变。
- 若输出含
$user,且当前登录用户名为crm_user,那新建表会优先尝试建在crm_user模式(如果该模式存在) - 若输出只有
public,但建表失败提示schema "public" does not exist,说明该库的public模式被删过(极少见,但可能) - Navicat 的“新建表”对话框里不会显式让你选 Schema,它完全依赖当前连接的
search_path
如何让Navicat建表时自动进指定Schema(比如 analytics)
不能靠界面点选,得靠 SQL 级配置。最稳妥的做法是在连接建立后,立即执行 SET search_path TO analytics, public; —— 这条命令会影响后续所有未显式指定 Schema 的 DDL 和 DML。
- 在 Navicat 中:右键连接 → “运行SQL文件” 或直接打开查询窗口粘贴执行
- 生效范围:仅当前连接会话,关闭连接即失效
- 若想永久生效,需在 PostgreSQL 用户级设置:
ALTER ROLE your_user SET search_path TO analytics, public; - 注意顺序:PostgreSQL 按
search_path从左到右查找,analytics在前,CREATE TABLE users就等价于CREATE TABLE analytics.users
在Navicat对象树里找不到自定义Schema怎么办
不是 Schema 不存在,而是 Navicat 默认只展开 public 和系统 schema(如 pg_catalog)。你需要手动刷新或调整显示策略。
- 右键数据库节点 → “刷新”(不是右键 schema 下拉菜单)
- 若仍不显示,检查该 Schema 是否真被创建:
\dn(psql 命令)或执行SELECT schema_name FROM information_schema.schemata; - Navicat 17+ 支持在“选项”→“对象过滤器”中勾选“显示所有 Schema”,否则它默认隐藏空 schema 或非 public schema
- 常见误操作:用 Navicat “新建模式” 功能时,填了名字但没点“确定”或没提交,导致 schema 实际未创建
建表时显式指定Schema比依赖search_path更安全吗
是,尤其在团队协作或自动化脚本场景下。显式写 CREATE TABLE analytics.revenue_log(...) 能彻底规避 search_path 变更、用户权限差异、连接复用等带来的歧义。
- Navicat 对象设计器里无法直接输入带 Schema 的表名,但你可以在“SQL 预览”面板里手动补全
analytics.前缀再执行 - 使用 Data Transfer 向导迁移表结构时,目标 Schema 必须在“高级”选项里单独指定,否则默认落到
public - 若目标 Schema 不存在,
CREATE TABLE analytics.xxx会直接报错schema "analytics" does not exist,而不会静默 fallback 到public - 权限检查也更明确:用户必须对
analytics有USAGE+CREATE权限,而不是只依赖search_path的隐式行为
search_path 的第一项,建出来的表仍可能跑到别处。所以别信界面,信 SHOW search_path; 和显式前缀。











