Navicat 16 不支持图形化创建或修改生成列(VIRTUAL/STORED),字段属性中无 AS 表达式输入框和类型选项,必须通过 SQL 手动执行 CREATE TABLE 或 ALTER TABLE 语句实现。
navicat 16 的可视化界面不支持直接设置生成列(virtual / stored)的表达式。 它能识别、显示已存在的生成列,但新建或修改时,“字段属性”面板里没有 as 输入框、没有 virtual/stored 类型勾选,也不会校验表达式合法性。你点保存,它就静默忽略生成列定义,或者报错 error 3105 (hy000) —— 这不是 navicat 的 bug,是它对 mysql 8.0+ 生成列语法的图形化支持缺失。
为什么字段属性面板里找不到 AS 表达式输入框
Navicat 16 的「新建字段」对话框只暴露基础字段属性:字段名、类型、长度/值、是否为空、默认值 等。它把生成列当成普通字段处理,完全没集成 MySQL 的 AS (expr) STORED/VIRTUAL 语法入口。这不是隐藏功能,是压根没实现。即使你手动在“默认值”里填 (price * qty),Navicat 也会把它当字符串存进 DEFAULT,而非生成列表达式。
- MySQL 原生 DDL 要求:生成列必须带显式类型 +
AS (...) STORED或AS (...) VIRTUAL - Navicat 字段编辑器不解析也不发送这类语法,它只构造
ADD COLUMN col_name type ...类语句 - 部分老版本 Navicat(如 15)甚至会把生成列误读为“无类型计算字段”,导致同步失败
实际可行的两种操作路径
绕过图形化限制,必须用 SQL 方式落地:
-
新建表时:切到「SQL」页,手写完整
CREATE TABLE,例如:CREATE TABLE orders ( id INT PRIMARY KEY, price DECIMAL(10,2), qty INT, total_amount DECIMAL(12,2) AS (price * qty) STORED );
-
已有表加生成列:右键表 → 「对象信息」→ 切换到「SQL」标签页 → 在底部编辑框执行:
ALTER TABLE orders ADD COLUMN name_upper VARCHAR(100) AS (UPPER(name)) STORED;
注意:UPPER()后必须有括号,且类型VARCHAR(100)不可省略
常见报错与对应修复动作
执行 SQL 时遇到错误,基本都卡在这三类:
-
ERROR 3105 (HY000): The value specified for generated column 'xxx' is not allowed→ 表达式用了非确定性函数(如NOW()、RAND())放在VIRTUAL列;换成STORED,或删掉非确定函数 -
ERROR 3106 (HY000): Generated column cannot refer to a generated column→VIRTUAL列引用了另一个生成列,且被引用列定义在后;调整建表顺序,或全改用STORED -
ERROR 1366: Incorrect string value→ 字符串拼接没处理字符集,比如CONCAT(a, b)中 a/b 排序规则冲突;改用CONVERT(CONCAT(a, b) USING utf8mb4)
别在 Navicat 的字段属性里反复试错。生成列的语法校验、依赖顺序、确定性判断,MySQL Server 自己才说得算。图形界面只负责展示结果,不参与逻辑构建——这点容易被忽略,但恰恰是所有失败操作的根源。











