MySQL外键约束添加失败求助(错误码ER_FK_NO_INDEX_PARENT)
问题分析与解决
错误原因
表依赖关系完全颠倒:
你把外键的指向搞反了。Etape_是存储所有步骤信息的基础表,应该是EtapexProjet_(项目-步骤关联表)去引用Etape_的idEtape,而不是反过来让Etape_引用关联表。缺失索引导致外键约束失败:
原代码中Etape_的外键指向EtapexProjet_的idEtape,但EtapexProjet_的主键是复合主键(idProjet, idEtape),idEtape不是单独的索引,MySQL要求被引用的列必须有索引(主键或普通索引),所以抛出ER_FK_NO_INDEX_PARENT错误。
修正后的建表代码
-- Client CREATE TABLE IF NOT EXISTS jegere.client_ ( idClient INT PRIMARY KEY, nomClient VARCHAR(45) NOT NULL, adresse VARCHAR(45) NOT NULL UNIQUE, telephone VARCHAR(45) NOT NULL UNIQUE, adresseCourriel VARCHAR(45) NOT NULL UNIQUE ); -- Employés CREATE TABLE IF NOT EXISTS jegere.Employe_ ( idEmploye INT PRIMARY KEY, nomEmploye VARCHAR(45) NOT NULL, adresse VARCHAR(45) NOT NULL UNIQUE, telephone VARCHAR(45) NOT NULL UNIQUE, adresseCourriel VARCHAR(45) NOT NULL UNIQUE ); -- Projet CREATE TABLE IF NOT EXISTS jegere.Projet_ ( idProjet INT PRIMARY KEY, idClient INT , nomProjet VARCHAR(45) NOT NULL , dateDebut DATE NOT NULL , dateFin DATE, idResponsable INT NOT NULL , FOREIGN KEY (idClient ) REFERENCES jegere.Client_ (idClient ), FOREIGN KEY (idResponsable ) REFERENCES jegere.Employe_ (idEmploye ) ); -- RessourcesProjet CREATE TABLE IF NOT EXISTS jegere.RessourcesProjet_ ( idProjet INT NOT NULL, idEmploye INT NOT NULL, nbrHeure INT NOT NULL, PrixHeure FLOAT NOT NULL, PRIMARY KEY(idProjet, idEmploye), FOREIGN KEY(idProjet) REFERENCES jegere.Projet_(idProjet), FOREIGN KEY(idEmploye) REFERENCES jegere.Employe_(idEmploye) ); -- Etapes(先创建基础步骤表) CREATE TABLE IF NOT EXISTS jegere.Etape_ ( idEtape INT PRIMARY KEY, nomEtape VARCHAR(45) NOT NULL, Livrable VARCHAR(100) NOT NULL ); -- Etape X Projet(再创建关联表,引用基础表) CREATE TABLE IF NOT EXISTS jegere.EtapexProjet_ ( idEtape INT NOT NULL, idProjet INT NOT NULL, dateDebut DATE NOT NULL , dateFin DATE, PRIMARY KEY(idProjet, idEtape), FOREIGN KEY(idProjet) REFERENCES jegere.Projet_(idProjet), FOREIGN KEY(idEtape) REFERENCES jegere.Etape_(idEtape) -- 改为引用Etape_的主键 );
关键修改点
- 调整表的创建顺序:先创建
Etape_基础表,再创建EtapexProjet_关联表 - 移除
Etape_中外键指向关联表的错误代码 - 在
EtapexProjet_中添加指向Etape_.idEtape的外键约束,符合"基础表被关联表引用"的逻辑 - 修正原代码中引用表时省略schema(
jegere.)的问题,避免因当前schema不一致导致的错误
内容的提问来源于stack exchange,提问作者Lithio3D
相关产品推荐
相关产品推荐

