MySQL建表报1822错误:添加外键约束失败,关联表users缺少索引求解
问题排查及解决方法
核心错误原因
- 外键定义逻辑错误:你当前在
users表中添加的是自引用外键,试图将本表的user字段关联本表的user字段,该定义没有实际业务意义,也是触发1822报错的直接原因。结合你的表结构设计意图,你应该是要把books表的user字段关联到users表的user字段,外键要定义在books表中而非users表中。 - 建表顺序错误:存在外键关联关系时,必须先创建被引用的父表(这里是
users表),再创建引用父表的子表(这里是books表),你当前先建books再建users的顺序本身就不满足外键约束的创建要求。
额外优化建议
phoneNo字段不要用INT类型存储,INT类型的最大值为2147483647,无法容纳11位手机号,建议修改为BIGINT或者VARCHAR类型。
修正后的完整SQL代码
-- 先创建父表 users DROP TABLE IF EXISTS `users`; CREATE TABLE `users`( `nameFirst` VARCHAR(10) NOT NULL, `nameLast` VARCHAR(10), `user` VARCHAR(10) NOT NULL UNIQUE, `email` VARCHAR(20) NOT NULL, `phoneNo` BIGINT, -- 替换原来的INT类型 `major` VARCHAR(10), `major2` VARCHAR(10), PRIMARY KEY (`email`) ); -- 再创建子表 books,外键定义在本表中 DROP TABLE IF EXISTS `books`; CREATE TABLE `books`( `title` VARCHAR(50) NOT NULL, `year` INT, `edition` VARCHAR(10), `authorLast` VARCHAR(10), `authorFirst` VARCHAR(10), `major` VARCHAR(4), `courseNo` INT, `profLast` VARCHAR(10), `profFirst` VARCHAR(10), `quality` VARCHAR(10) NOT NULL, `price` FLOAT NOT NULL, `user` VARCHAR(10) NOT NULL UNIQUE, `ISBN` BIGINT NOT NULL, PRIMARY KEY (`ISBN`), -- 外键关联到users表的user字段 FOREIGN KEY (`user`) REFERENCES `users` (`user`) ON DELETE CASCADE ON UPDATE CASCADE );
内容的提问来源于stack exchange,提问作者user16845333
相关产品推荐
相关产品推荐

