MySQL Workbench反向工程含计算(生成)字段的schema报错解决
问题描述
使用MySQL Workbench对数据库schema执行反向工程操作时失败,抛出如下错误:
16:06:46 [ERR][ grt]: (127, 53) "GENERATED" is not valid at this position, expecting ')' 16:06:46 [ERR][ grt]: (149, 53) "GENERATED" is not valid at this position, expecting ')'
触发该报错的是库中两张定义了虚拟生成列的表,建表语句如下:
CREATE TABLE IF NOT EXISTS `student` ( `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `Name` varchar(255) NOT NULL, `Firstname` varchar(255) NOT NULL, `Fullname` varchar(250) GENERATED ALWAYS AS (concat_ws(' ',`Firstname`,`Name`)) VIRTUAL, PRIMARY KEY (`ID`) );
CREATE TABLE IF NOT EXISTS `teacher` ( `Abbr` char(3) NOT NULL, `Name` varchar(255) NOT NULL, `Firstname` varchar(255) NOT NULL, `FullName` varchar(255) GENERATED ALWAYS AS (concat_ws(' ',`Firstname`,`Name`)) VIRTUAL, PRIMARY KEY (`Abbr`) );
需要找到可行方案,对包含生成属性字段的schema完成反向工程操作。
报错原因
该问题是低版本MySQL Workbench内置的SQL语法解析器存在兼容缺陷导致:MySQL从5.7版本开始正式支持生成列(Generated Column)特性,语法中GENERATED ALWAYS AS (表达式)的定义格式没有被旧版本Workbench的grt解析模块正确识别,解析到GENERATED关键字时误判字段定义已经结束,因此抛出“期待右括号”的语法错误。
可行解决方案
- 升级MySQL Workbench到8.0.29及以上的稳定版本。官方已经在新版本中修复了生成列语法的解析兼容问题,升级后直接执行反向工程流程,即可正常识别包含虚拟列、存储生成列的表结构,无需额外修改。
- 若受环境限制无法升级Workbench,可通过临时修改SQL绕过解析限制:
- 导出目标schema的全量建表SQL脚本,将脚本中所有生成列的
GENERATED ALWAYS AS (...) VIRTUAL/STORED定义片段临时替换为字段注释,例如将学生表的Fullname字段定义修改为 ``Fullnamevarchar(250) COMMENT '生成列,计算规则:concat_ws(' ',Firstname,Name)' - 将修改后的SQL导入本地临时数据库,对该临时库执行反向工程生成基础ER模型。
- 模型生成完成后,在Workbench的表编辑界面手动将对应字段改回生成列配置,补全计算表达式、虚拟/存储类型属性即可。
- 导出目标schema的全量建表SQL脚本,将脚本中所有生成列的
- 反向工程的对象筛选步骤直接跳过存在生成列的表,等其余表的结构、关联关系导入完成后,手动在模型中新建这几张表,对照原始建表语句补全字段、主键、外键关联配置即可。
内容的提问来源于stack exchange,提问作者theking2
相关产品推荐
相关产品推荐

