MySQL Workbench8.0同步Azure MySQL5.7报1064 VISIBLE语法错误
问题根因
报错1064的核心原因是版本语法不兼容:VISIBLE是MySQL 8.0版本新增的索引可见性控制语法,你使用的目标数据库是Azure Database for MySQL 5.7,该版本完全不识别这个关键字,所以解析到索引定义后的VISIBLE时直接抛出语法错误。
这个问题是高版本MySQL Workbench的常见兼容问题:8.0版本的Workbench默认会生成适配MySQL 8.0的同步SQL,不会自动适配低版本实例的语法规则,你贴出的报错位置、SQL语句里的索引定义完全匹配这个问题特征。
解决方法
按优先级从高到低选以下方案即可:
- 永久修复:修改模型的目标数据库版本
打开你的数据模型文件,点击顶部菜单栏的Model-Model Options,在设置页找到MySQL版本下拉选项,将默认的8.0改为5.7,保存设置后重新触发同步即可,后续生成的所有SQL都会自动适配5.7的语法规则,不会再带出VISIBLE这类高版本独有的关键字。 - 针对性修复:关闭索引可见性配置
如果改完版本后还是生成带VISIBLE的语句,可以双击打开出问题的employee表编辑页,切换到Indexes标签,把所有索引对应的Visible勾选框全部取消勾选——5.7没有索引隐藏/显示的功能,所有索引默认都是可见的,不需要额外声明。 - 临时快速修复:手动修改同步SQL
如果只是临时测试不想改模型配置,可以在同步流程的SQL预览步骤,直接把生成的建表语句里所有的VISIBLE字符串全局删除,再执行脚本即可。修正后可正常执行的建表语句参考:
CREATE TABLE IF NOT EXISTS `azcare_schema`.`employee` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `emp_id` VARCHAR(10) NOT NULL, `first_name` VARCHAR(20) NULL DEFAULT NULL, `middle_name` VARCHAR(30) NULL DEFAULT NULL, `last_name` VARCHAR(20) NULL DEFAULT NULL, `date_of_birth` VARCHAR(45) NULL DEFAULT NULL, `gender` CHAR(6) NULL DEFAULT NULL, `marital_status` VARCHAR(20) NULL DEFAULT NULL, `nationality` VARCHAR(30) NULL DEFAULT NULL, `passport_number` VARCHAR(20) NULL DEFAULT NULL, `sponser` VARCHAR(40) NULL DEFAULT NULL, `joining_date` DATE NULL DEFAULT NULL, `department` CHAR(100) NULL DEFAULT NULL, `education_degree` VARCHAR(45) NULL DEFAULT NULL, `religion` VARCHAR(30) NULL DEFAULT NULL, `blood_group` CHAR(4) NULL DEFAULT NULL, `create_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE INDEX `id_UNIQUE` (`id` ASC), PRIMARY KEY (`emp_id`), UNIQUE INDEX `employee_id_UNIQUE` (`emp_id` ASC) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;
避坑提示
后续使用8.0及以上版本的Workbench往5.x版本的MySQL实例同步模型前,一定要先把模型的目标版本改成和实例一致,不然还可能触发其他兼容问题,比如8.0支持的CTE、窗口函数、原子DDL、utf8mb4默认排序规则等语法在5.7版本里都无法正常执行。
另外你当前的表结构里自增字段id没有设为主键,虽然靠唯一索引可以正常运行,但常规设计里建议把自增列设为主键,业务唯一字段emp_id单独加唯一索引即可,能避免后续一些隐式的索引问题。
内容的提问来源于stack exchange,提问作者Unis
相关产品推荐
相关产品推荐

