MySQL错误1215无法在不同的表中添加外键约束 - FK

时间:2013-11-24 20:06:23

标签: mysql sql foreign-keys create-table

我在mysql workbench上的新东西,我尝试了很多东西让我的脚本工作但我只是不能......我有这些表:

CREATE TABLE Utilizador (email varchar(40) not null, nome varchar(50) 
not null,  dataNascimento date,  profissao varchar(50) not null,      
reputacao double(3,2) unsigned not null, constraint pk_Utilizador     
primary key(email))

这是第一个创建的表格!

CREATE TABLE POI (email varchar(40) not null,  designacaoPOI
varchar(10) not null,  coordenadaX int,  coordenadaY int, 
descricaoPOI varchar(200), constraint pk_POI primary key(email,
designacaoPOI), constraint fk_POI foreign key(email) references
Utilizador(email) on delete cascade)

这是第二个创建的表格!

CREATE TABLE Utilizador_POI (email varchar(40) not null, designacaoPOI
varchar(10) not null, constraint pk_Utilizador_POI primary key(email,
designacaoPOI), constraint fk1_Utilizador_POI foreign key(email)
references Utilizador(email) on delete cascade,  constraint
fk2_Utilizador_POI foreign key(designacaoPOI) references
POI(designacaoPOI) on delete cascade)

此表给出了错误:错误代码:1215。无法添加外键约束

我做了一些测试,我几乎可以确定问题出在外键“designacaoPOI”中。另一个FK(“电子邮件”)不给我任何错误,所以问题可能在表POI中?

先谢谢!

3 个答案:

答案 0 :(得分:1)

我认为问题在于Utilizador_POI.email引用POI.email本身引用Utilizador.email。 MySQL可能对双链接感到不安。

此外,由于UtilizadorPOI之间似乎存在多对多的关系,我认为Utilizador_POI的结构并不是您真正想要的。相反,Utilizador_POI应引用Utilizador中的主键和POI中匹配的主键。

答案 1 :(得分:1)

这里的问题有两个:

1 / ID使用PRIMARY KEY s

您应该将ID用于主键而不是VARCHAR s或任何具有任何真实世界“商业含义”的内容。如果您希望emailUtilizador表中唯一,则emaildesignacaoPOI的组合在POI表中是唯一的,并且相同组合(emaildesignacaoPOI)在Utilizador_POI中是唯一的,您应该使用UNIQUE KEY约束而不是PRIMARY KEY约束。

2 / DELETE CASCADE上的FOREIGN KEY PRIMARY KEY不能引用Utilizador_POI

在第三个表FOREIGN KEY中,您有两个POI个引用PRIMARY KEY。不幸的是,POI DELETE CASCADE是一个复合键,因此MySQL不知道如何处理FOREIGN KEY,因为{{1}之间没有一对一的关系在Utilizador_POIPRIMARY KEY的{​​{1}}。{/ p>

如果您将所有表格更改为POI PRIMARY KEY,则如下所示:

ID

然后,您可以CREATE TABLE blah ( id INT(9) AUTO_INCREMENT NOT NULL .... PRIMARY KEY (id) ); 引用每个表格,IDFOREIGN KEY都可以使用。

答案 2 :(得分:0)

问题出在你的第二张桌子上。您的主键是(email,designacaoPOI),当您尝试在表中引用它时,它会因此而导致错误:

  

InnoDB允许外键引用任何索引列或组   列。但是,在引用的表中,必须有一个索引   其中引用的列被列为的第一列   同样的顺序。

要使其正常工作,请更改第二个故事PRIMARY KEY的顺序:

CREATE TABLE POI (
  email VARCHAR(40) NOT NULL,
  designacaoPOI VARCHAR(10) NOT NULL,
  coordenadaX INT,
  coordenadaY INT,
  descricaoPOI VARCHAR(200),
  CONSTRAINT pk_POI PRIMARY KEY (designacaoPOI,email),  -- changed the order
  CONSTRAINT fk_POI FOREIGN KEY (email) 
     REFERENCES Utilizador(email) ON DELETE CASCADE
  );

sqlfiddle demo

或为designacaoPOI添加索引:

CREATE TABLE POI (
  email VARCHAR(40) NOT NULL,
  designacaoPOI VARCHAR(10) NOT NULL,
  coordenadaX INT,
  coordenadaY INT,
  descricaoPOI VARCHAR(200),
  CONSTRAINT pk_POI PRIMARY KEY (designacaoPOI,email),
  KEY key_designacaoPOI(designacaoPOI),  -- added index for that column
  CONSTRAINT fk_POI FOREIGN KEY (email) 
     REFERENCES Utilizador(email) ON DELETE CASCADE
  );

sqlfiddle demo

这些解决方案都可以让您创建第三个表而不会出错。

相关问题