MySQL创建数据库时Error Code 1822外键约束失败问题求助
解决MySQL外键约束错误(Error Code: 1822)
错误原因
MySQL对外键约束有严格要求:外键关联的列必须是被引用表的主键,或者是该表上的唯一索引。你创建的Job表使用的是复合主键(Company_Name, Position),单独的Position字段并不具备唯一性(不同公司可以有相同职位名称),因此直接将Job_title关联到Position会触发索引缺失的错误。
解决方案
方案一:关联复合主键的全部字段(推荐)
由于Job表的主键是Company_Name + Position的组合,外键需要同时引用这两个字段才能唯一锁定Job表中的某一行。修改Job_Type和Apply表的创建语句如下:
修改后的Job_Type表
CREATE TABLE Job_Type ( Company_Name VARCHAR(30) NOT NULL, Job_title VARCHAR(40) NOT NULL, Job_Type VARCHAR(50) NOT NULL, FOREIGN KEY (Company_Name) REFERENCES Company_Data(Name) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (Company_Name, Job_title) REFERENCES Job(Company_Name, Position) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY (Company_Name, Job_title, Job_Type) );
修改后的Apply表
CREATE TABLE Apply ( Company_Name VARCHAR(30) NOT NULL, Job_title VARCHAR(40) NOT NULL, User_Email VARCHAR(30) NOT NULL, Cover_letter VARCHAR(150) NOT NULL, FOREIGN KEY (User_Email) REFERENCES User(Email_Address) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (Company_Name, Job_title) REFERENCES Job(Company_Name, Position) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY (Company_Name, Job_title, User_Email) );
方案二:给Position字段添加唯一索引(仅限特定业务场景)
如果你的业务逻辑中,所有公司的职位名称是全局唯一的(不会出现不同公司使用相同职位名的情况),可以给Job表的Position字段添加唯一索引:
创建Job表时直接添加唯一约束
CREATE TABLE Job ( Company_Name VARCHAR(30) NOT NULL, Position VARCHAR(40) NOT NULL UNIQUE, City VARCHAR(15) NOT NULL, Country VARCHAR(15) NOT NULL, Salary INT NOT NULL, Career_level VARCHAR(30) NOT NULL, Experience VARCHAR(30) NOT NULL, Education_level VARCHAR(30) NOT NULL, Vacancies INT NOT NULL, FOREIGN KEY (Company_Name) REFERENCES Company_Data(Name) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY (Company_Name, Position) );
或对已存在的Job表添加唯一索引
ALTER TABLE Job ADD UNIQUE INDEX idx_unique_position(Position);
注意:此方案仅适用于职位名全局唯一的场景,否则会因重复职位名触发唯一约束错误。
内容的提问来源于stack exchange,提问作者Abdelrahman Elaskary
相关产品推荐
相关产品推荐

