使用MySQL Workbench在已编制索引的列上创建外键

我正在使用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参考手册所说的:

In the referencing table, there must be an index where the foreign key
columns are listed as the first columns in the same order. Such an
index is created on the referencing table automatically if it does not
exist.

所以我理解不需要创建索引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可能足够智能,不会创建完全冗余的索引,我不必担心它……?

最佳答案 (我假设这是在定义模型时.)

请参阅Bug 53277,其中我提到了以下模糊的解决方法:

您可以从外键及其要删除的相应生成索引开始.确保密钥(至少暂时)在单个非唯一列上.在“索引”选项卡中,将“类型”更改为“UNIQUE”.然后转到Columns选项卡,现在检查UQ,并取消选中它.消除了不需要的索引!

点赞