MySQL Workbench生成脚本导入phpMyAdmin报#1064错误如何解决
报错根本原因
你使用的MySQL 5.6.28版本不支持GENERATED ALWAYS AS ... STORED语法,该生成列功能是MySQL 5.7版本才正式上线的特性,低版本运行该语句必然触发1064语法错误。
适配解决方案(二选一即可)
- 方案1:升级服务器MySQL版本到5.7及以上,无需修改现有SQL脚本即可正常导入,是成本最低的解决方式。
- 方案2:如果暂时无法升级MySQL版本,调整建表逻辑替换生成列实现:
- 将
attack和defense修改为普通INT字段 - 新增触发器,在
knight表执行INSERT、UPDATE操作时自动计算这两个字段的值,实现和原生生成列完全一致的效果。
- 将
适配MySQL 5.6版本的修正SQL脚本
CREATE TABLE IF NOT EXISTS `knight` ( `idKnight` INT NOT NULL AUTO_INCREMENT, `strength` INT NOT NULL DEFAULT 1, `agility` INT NOT NULL DEFAULT 1, `vitality` INT NOT NULL DEFAULT 1, `attack` INT NOT NULL, `defense` INT NOT NULL, `idUser` INT NOT NULL, `idTavern` INT NULL, PRIMARY KEY (`idKnight`), INDEX `fk_user_idx` (`idUser` ASC), INDEX `fk_tavern_idx` (`idTavern` ASC), CONSTRAINT `fk_user` FOREIGN KEY (`idUser`) REFERENCES `user` (`idUser`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_tavern` FOREIGN KEY (`idTavern`) REFERENCES `tavern` (`idTavern`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;
配套触发器脚本:
-- 插入数据时自动计算attack、defense字段值 DELIMITER // CREATE TRIGGER `tr_knight_before_insert` BEFORE INSERT ON `knight` FOR EACH ROW BEGIN SET NEW.attack = NEW.agility * NEW.strength; SET NEW.defense = NEW.vitality * NEW.strength; END // DELIMITER ; -- 更新数据时自动重算attack、defense字段值 DELIMITER // CREATE TRIGGER `tr_knight_before_update` BEFORE UPDATE ON `knight` FOR EACH ROW BEGIN SET NEW.attack = NEW.agility * NEW.strength; SET NEW.defense = NEW.vitality * NEW.strength; END // DELIMITER ;
MySQL Workbench版本同步设置
要让Workbench直接生成适配5.6版本的脚本,按以下步骤调整设置即可:
- 打开对应数据库模型文件,点击顶部菜单栏
Edit->Preferences - 在弹出窗口左侧导航栏找到
Modeling->MySQL分类 - 将
Default Target MySQL Version参数修改为5.6.28,保存设置后重新导出SQL脚本,Workbench会自动屏蔽5.6版本不支持的语法特性。
内容的提问来源于stack exchange,提问作者DevelBase2
相关产品推荐
相关产品推荐

