Navicat 16 不支持图形化配置 MergeTree 的 SETTINGS 参数,必须通过 CREATE TABLE 或 ALTER TABLE ... MODIFY SETTING 的 SQL 方式显式声明;GUI 建表仅生成基础 ENGINE = MergeTree() 语句,不解析分区、排序、TTL 或 SETTINGS 等 ClickHouse 特有语法。
navicat 16 本身不支持在图形化表设计器中直接指定 mergetree 的 settings 参数,也无法通过下拉菜单选择或编辑 index_granularity、ttl、max_suspicious_broken_parts 等参数。所有这些必须通过 create table 或 alter table ... modify setting 的 sql 方式显式声明。
Navicat 建表时无法配置 MergeTree 参数的原因
Navicat 的「新建表」设计器只识别标准 SQL 的列定义和基础约束(如主键、非空),对 ClickHouse 特有的引擎参数(尤其是 ENGINE = MergeTree() ... SETTINGS ... 子句)没有解析能力。它会把 SETTINGS 视为语法错误或直接忽略。
- 当你在 Navicat 中用 GUI 创建表并选 “MergeTree” 引擎,它实际生成的语句类似
ENGINE = MergeTree(),不含任何SETTINGS - 分区(
PARTITION BY)、排序键(ORDER BY)、主键(PRIMARY KEY)等字段虽能填入,但 Navicat 不校验其是否符合 MergeTree 要求(例如ORDER BY必须包含PARTITION BY表达式中的所有列) - 像
TTL、SAMPLE BY这类子句,GUI 根本没有对应输入框,强行写进备注栏也不会被纳入建表语句
正确做法:绕过设计器,用 SQL 创建带参数的 MergeTree 表
在 Navicat 中,必须切换到「查询」窗口执行原生 DDL。这是唯一可靠的方式。
- 右键连接 → 「新建查询」,粘贴完整建表语句,例如:
CREATE TABLE default.orders (
order_id UInt64,
event_time DateTime,
amount Decimal(10,2)
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_time)
ORDER BY (event_time, order_id)
TTL event_time + INTERVAL 90 DAY
SETTINGS index_granularity = 4096, max_suspicious_broken_parts = 200;
- 注意:所有参数名(如
index_granularity)和值都必须手写,Navicat 不提供自动补全或校验 -
TTL列必须是Date或DateTime类型,否则建表会报错DB::Exception: TTL expression must be Date or DateTime - 如果误将
SETTINGS写成SETTING(少个 s),会触发语法错误:Expected one of: SETTINGS, PRIMARY KEY
修改已有表的 MergeTree 参数只能用 ALTER TABLE … MODIFY SETTING
Navicat 的「设计表」功能对已存在表点击后,仍无法编辑引擎参数 —— 它只会显示列结构和索引,SETTINGS 完全不可见。想调整参数,必须执行 SQL:
- 修改单个参数:
ALTER TABLE default.orders MODIFY SETTING index_granularity = 2048;
- 重置为全局默认值(即 config.xml 中
<merge_tree>下的值):
ALTER TABLE default.orders RESET SETTING index_granularity;
- 一次修改多个参数需重复写
MODIFY SETTING,不能逗号分隔;否则报错Expected one of: MODIFY SETTING, RESET SETTING - 部分参数(如
background_pool_size)属于服务器级配置,不能用ALTER TABLE修改,必须改config.xml并重启服务
真正容易被忽略的是:Navicat 执行完 ALTER TABLE ... MODIFY SETTING 后,刷新表结构不会显示新值 —— 它根本不读取 system.tables 的 engine_full 字段或 system.merge_tree_settings。你得手动查:SELECT engine_full FROM system.tables WHERE database='default' AND name='orders',才能确认参数是否生效。


















