MySQL Workbench 6.3.9无法为含虚拟生成列的父表创建约束
解决MySQL Workbench无法为含虚拟生成列的父表创建约束的问题
结合你的环境(MySQL Workbench 6.3.9 + MySQL 5.7.21),这个问题主要是版本兼容性bug,再加上虚拟生成列的特性限制导致的,下面给你具体的解决方案:
1. 手动用SQL语句创建约束(绕过Workbench图形界面)
MySQL Workbench 6.3.9是比较早期的版本,它的GUI对MySQL 5.7引入的虚拟生成列支持不完善,没法正确识别这类列作为外键约束的目标。你可以直接写SQL语句来创建约束,完全避开这个限制。
假设你的父表(比如Users)里的虚拟生成列是StoredUserID(必须是STORED类型,这点后面会说明),要给UserDevices的UserID列创建外键指向它,执行以下代码:
ALTER TABLE UserDevices ADD CONSTRAINT fk_userdevices_storeduserid FOREIGN KEY (UserID) REFERENCES Users(StoredUserID);
执行前请确保:
- 父表的虚拟生成列已经设置了主键或唯一索引(外键要求被引用列必须是索引列)
- 子表
UserID列的数据类型和父表虚拟列完全一致
2. 升级MySQL Workbench到更高版本
Workbench 6.3.9是2017年的版本,后续的8.0.x及以上版本已经修复了大量对生成列的兼容性问题。升级到适配MySQL 5.7的新版Workbench后,图形界面应该能正常识别虚拟生成列并创建约束。
3. 确认父表虚拟列的类型是否符合外键要求
MySQL 5.7里,虚拟生成列(VIRTUAL)不能作为外键约束的被引用列——因为这类列不实际存储数据,MySQL没法维护外键关联的完整性。只有**存储生成列(STORED)**才能被外键引用。
如果你的父表虚拟列是VIRTUAL类型,需要先把它改成STORED:
ALTER TABLE Users MODIFY COLUMN StoredUserID INT(11) GENERATED ALWAYS AS (你的生成表达式) STORED;
替换你的生成表达式为你原来的虚拟列计算逻辑,修改完成后再创建外键约束即可。
内容的提问来源于stack exchange,提问作者DarbyM
相关产品推荐
相关产品推荐

