MySQL添加外键约束时`screenshot_ibfk_1`的build_id列不兼容求助
问题根因
出现该报错的核心原因是外键关联的两个字段字符集、排序规则不兼容,同时字段的非空属性也存在差异:
build表的build_id字段:字符集为utf8mb3,使用该字符集的默认排序规则,字段属性为NOT NULLscreenshot表的build_id字段:字符集为utf8mb4,排序规则为utf8mb4_0900_ai_ci,字段属性为DEFAULT NULL
解决步骤
你可以选择任意一种方案处理:
方案一:修改
screenshot表的build_id字段,对齐build表的字符集、排序规则和属性,之后再添加外键
执行命令如下:-- 修改字段属性对齐 ALTER TABLE screenshot MODIFY COLUMN `build_id` varchar(255) CHARACTER SET utf8mb3 NOT NULL; -- 重新添加外键 ALTER TABLE screenshot ADD FOREIGN KEY (build_id) REFERENCES build(build_id);注意:执行修改字段操作前,请先确认
screenshot表中现有build_id不存在空值,也不存在build表中没有的非法值,否则会执行失败。方案二:如果业务需要保留
screenshot表整体的utf8mb4字符集,可以统一将build表的字符集升级为utf8mb4,再对齐排序规则后添加外键,该方案更适配后续多语言、emoji等特殊字符存储需求:
执行命令如下:-- 修改build表字符集和排序规则,同时对齐build_id字段属性 ALTER TABLE build CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- 修改screenshot的build_id为非空,对齐属性 ALTER TABLE screenshot MODIFY COLUMN `build_id` varchar(255) NOT NULL; -- 重新添加外键 ALTER TABLE screenshot ADD FOREIGN KEY (build_id) REFERENCES build(build_id);注意:修改表字符集操作会锁表,表数据量大时需要在业务低峰期执行。
内容的提问来源于stack exchange,提问作者arush saxena
相关产品推荐
相关产品推荐

