You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:37:32