Navicat 16 不支持可视化创建 PostgreSQL 分区表,因其表设计器仅面向普通表结构,不识别 PARTITION BY 语法、不生成分区建表语句,也不自动加载或归组子分区。

Navicat 16 不支持可视化创建 PostgreSQL 分区表
直接说结论:Navicat 16 的表设计器、向导或右键菜单里,没有任何选项能让你“点选分区策略”“拖拽分区键”或“设置分区范围”。它不识别 PARTITION BY RANGE、PARTITION BY LIST 这类语法,也不提供分区子表的图形化挂载入口。
为什么 Navicat 无法可视化建分区表?
根本原因在于 PostgreSQL 的分区机制是**基于继承 + 约束 + 触发器(旧版)或原生声明式分区(v10+)**,而 Navicat 的表设计器只面向普通表结构(列、类型、主键、索引、外键),不解析或生成 CREATE TABLE ... PARTITION OF 或 FOR VALUES FROM (...) TO (...) 这类语句。
- 你右键数据库 → “新建表”,弹出的界面里没有“分区类型”下拉框
- 你用表设计器填完字段点保存,Navicat 生成的是
CREATE TABLE,不是CREATE TABLE ... PARTITION BY - 即使你手动在查询窗口执行了分区父表创建语句,Navicat 对象树也不会自动展开其子分区——它不监听
pg_partitioned_table系统视图变化
那怎么在 Navicat 里实际建分区表?
只能靠 SQL 手动写,但可以借助 Navicat 的部分辅助能力降低出错率:
- 先在查询窗口执行父表创建语句,例如:
CREATE TABLE sales (id SERIAL, sale_date DATE, amount NUMERIC) PARTITION BY RANGE (sale_date);
- 再为每个分区执行
CREATE TABLE sales_2024q1 PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('2024-04-01'); - 建完后,右键连接 → “刷新”,让对象树重新加载;虽然子分区可能仍不自动归组到父表名下,但会出现在“表”列表中(名称可辨识)
- 验证分区是否生效:执行
SELECT relname, relispartition FROM pg_class WHERE relname LIKE 'sales%';,确认relispartition为t
容易被忽略的关键点
PostgreSQL 分区表依赖几个硬性前提,Navicat 完全不校验,但缺一不可:
- 父表必须有明确的分区键,且该列不能为
NULL(否则INSERT会报错:“no partition of relation ... found for row”) - 所有分区子表必须与父表**完全一致的列定义、数据类型、NOT NULL 约束**;Navicat 建普通表时加的约束,不会自动同步到子表
- 如果用了
DEFAULT值或生成列(GENERATED ALWAYS AS),需确保在每个子表上显式重复定义——Navicat 不帮你补 - 分区键上建议手动建索引,Navicat 的“索引设计器”对子表有效,但不会自动为父表创建分区键索引


















