我已经看过很多与我有同样问题的话题,但没有人对我的案例有好的答案。
我已经制作了一个模型,我从这个软件中获得了一个SQL脚本。 问题是我有错误:150在PhpMyAdmin中有一个外键。 我检查过,两个键的类型相同,但问题仍然存在。
你能帮我解决这个问题吗? 我有:
#1005 - Can't create table `candidathlon`.`#sql-21ac_3b`
(errno: 150"Foreign key constraint is incorrectly formed")
请求:
ALTER TABLE participer_a
ADD CONSTRAINT FK_participer_a_DateEvenement FOREIGN KEY (DateEvenement)
REFERENCES Evenement(DateEvenement)
这是我的表有这个问题:
CREATE TABLE Evenement(
NumEvenement int (11) Auto_increment NOT NULL ,
NomEvenement Varchar (25) NOT NULL ,
DateEvenement Date NOT NULL ,
PRIMARY KEY (NumEvenement ,DateEvenement ) ,
INDEX (NomEvenement)
)ENGINE=InnoDB;
CREATE TABLE Candidat(
DateNaissance Date NOT NULL ,
NumTelPort Varchar (25) NOT NULL ,
NumTelFixe Varchar (25) NOT NULL ,
Adresse Varchar (25) NOT NULL ,
TrouverEntreprise Bool NOT NULL ,
InscritCFA Bool NOT NULL ,
NumPersonne Int NOT NULL ,
NumStatut Int NOT NULL ,
NumVille Int NOT NULL ,
DateApprenti Date ,
NumInstit Int NOT NULL ,
PRIMARY KEY (NumPersonne ) ,
INDEX (TrouverEntreprise ,InscritCFA )
)ENGINE=InnoDB;
CREATE TABLE participer_a(
ParticipeEvent Bool NOT NULL ,
CommentaireEvent Varchar (100) ,
SouhaiteParticiper Bool NOT NULL ,
NumPersonne Int NOT NULL ,
NumEvenement Int NOT NULL ,
DateEvenement Date NOT NULL ,
PRIMARY KEY (NumPersonne ,NumEvenement ,DateEvenement )
)ENGINE=InnoDB;
ALTER TABLE participer_a ADD CONSTRAINT FK_participer_a_NumPersonne FOREIGN KEY (NumPersonne) REFERENCES Personne(NumPersonne);
ALTER TABLE participer_a ADD CONSTRAINT FK_participer_a_NumEvenement FOREIGN KEY (NumEvenement) REFERENCES Evenement(NumEvenement);
ALTER TABLE participer_a ADD CONSTRAINT FK_participer_a_DateEvenement FOREIGN KEY (DateEvenement) REFERENCES Evenement(DateEvenement);
答案 0 :(得分:2)
你想做什么:
ALTER TABLE participer_a
ADD CONSTRAINT FK_participer_a_DateEvenement
FOREIGN KEY (DateEvenement) REFERENCES Evenement(DateEvenement)
桌子上的钥匙:
PRIMARY KEY (NumEvenement ,DateEvenement ) ,
INDEX (NomEvenement)
这两个都不以DateEvenement
开头,这是MySQL外键约束所需要的。你需要:
INDEX (DateEvenement)
我想你真正想要的是这样的:
CREATE TABLE Evenement(
NumEvenement int (11) Auto_increment NOT NULL ,
NomEvenement Varchar (25) NOT NULL ,
DateEvenement Date NOT NULL ,
PRIMARY KEY (NumEvenement),
INDEX (DateEvenement) ,
UNIQUE (NomEvenement)
);
NumEvenement
在每一行都是唯一的。 auto_increment
通常是具有此类列的表中的主键。我猜这个事件的名字实际上是独一无二的。日期可能也是如此,但至少需要一个索引。