无法添加外键mysql错误1215

时间:2016-05-10 13:33:56

标签: mysql mysql-workbench

我对mysql很新,我不知道我做错了什么...... 我正在使用mysql workbench和

$ mysql -V

mysql  Ver 14.14 Distrib 5.7.12, for Linux (x86_64) using  EditLine wrapper

我尝试索引外键但没有。

create table Prodotti(
    ProdottoID int not null auto_increment,
    Descrizione nvarchar(50) not null,
    PrezzoUnitario decimal not null,
    RicavoUnitario decimal not null,
    constraint PK_Prodotti primary key(ProdottoID)
)ENGINE=INNODB; 

create table Ingredienti(
    IngredienteID int not null auto_increment,
    Descrizione nvarchar(50) not null,
    Giacenza int not null,
    CostoUnitario decimal not null,
    UnitaDiMisura nvarchar(45) not null,
    constraint PK_Ingredienti primary key(IngredienteID)
)ENGINE=INNODB;

create table Prodotti_Ingredienti(
    ProdottoID int not null,
    IngredienteID int not null,
    Quantita decimal not null,
    UnitaDiMisura nvarchar(45) not null,
    constraint FK_Prod_Ing_prodottoid foreign key(ProdottoID) references     Prodotti(ProdottoID)
        on delete cascade
    on update cascade,  
constraint FK_Prod_Ing_ingredienteidunitamisura foreign key(IngredienteID,UnitaDiMisura) references     Ingredienti(IngredienteID,UnitaDiMisura)
        on update cascade,
    constraint PK_Prod_Ing primary key(ProdottoID,IngredienteID)
)ENGINE=INNODB;

2 个答案:

答案 0 :(得分:1)

根据MySQL手册:

  

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

这意味着您需要在Ingredienti表中获得IngredienteID,UnitaDiMisura的索引,否则它将无效。

答案 1 :(得分:0)

问题是引用的键,它是复合键:

... references Ingredienti(IngredienteID, UnitaDiMisura)

根据MySQL documentation

  

MySQL要求外键和引用键上的索引   外键检查可以很快,不需要进行表扫描。

您可以使用以下语句创建此类索引:

CREATE INDEX id_index ON Ingredienti (IngredienteID, UnitaDiMisura);

然而,你应该小心这个FK真正实现了什么。由于复合(IngredienteID, UnitaDiMisura)不是表Ingredienti的PK,也不是唯一索引,因此最终可能会在多个引用中Ingredienti值的(IngredienteID, UnitaDiMisura)表。