我对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;
答案 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)
表。