我正在使用Workbench创建数据库模型,并创建了以下表格:
CREATE TABLE IF NOT EXISTS `Database`.`table1` (
`idtable1` INT NOT NULL ,
`uniquecolumn` INT NOT NULL ,
PRIMARY KEY (`idtable1`) ,
UNIQUE INDEX `UniqueIndex` (`uniquecolumn` ASC) )
ENGINE = InnoDB
它有一个主键和一个唯一键在我的第二列。
当我在它们上面创建外键约束时,Workbench会自动添加两个索引:
CREATE TABLE IF NOT EXISTS `Database`.`table1` (
`idtable1` INT NOT NULL ,
`uniquecolumn` INT NOT NULL ,
PRIMARY KEY (`idtable1`) ,
UNIQUE INDEX `UniqueIndex` (`uniquecolumn` ASC) ,
INDEX `FKOne` (`idtable1` ASC) , //here
INDEX `FKTwo` (`uniquecolumn` ASC) , //(I don't want this!)
CONSTRAINT `FKOne`
FOREIGN KEY (`idtable1` )
REFERENCES `Database`.`table2` (`idtable2` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FKTwo`
FOREIGN KEY (`uniquecolumn` )
REFERENCES `Database`.`table2` (`idtable2` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
在将外键添加到我的模型后,上述内容是前向生成的脚本。
我现在有四个索引。
MySQL参考手册中指出:
在引用表中,必须存在一个索引,其中包含外键列,并以相同顺序作为第一列。如果不存在此类索引,则会自动在引用表上创建此类索引。
因此,我理解不需要创建索引 FKOne
和 FKTwo
,因为已经在同一列和相同顺序上有一个主键和唯一索引。然而,MySQL Workbench不允许我删除索引 FKOne
和 FKTwo
。我认为我应该能够这样做:
CREATE TABLE IF NOT EXISTS `Database`.`table1` (
`idtable1` INT NOT NULL ,
`uniquecolumn` INT NOT NULL ,
PRIMARY KEY (`idtable1`) ,
UNIQUE INDEX `UniqueIndex` (`uniquecolumn` ASC) ,
CONSTRAINT `FKOne`
FOREIGN KEY (`idtable1` )
REFERENCES `Database`.`table2` (`idtable2` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FKTwo`
FOREIGN KEY (`uniquecolumn` )
REFERENCES `Database`.`table2` (`idtable2` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
我说的对吗?这段代码能用吗?有没有办法在Workbench中完成它?(除了在正向工程之前最后一刻删除那两行代码)。
或者也许MySQL足够聪明,不会创建完全冗余的索引,我不必担心它...?