4

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

在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会在引用表上自动创建此类索引。

所以我知道没有必要创建索引FKOneFKTwo,因为已经有一个主键和一个唯一索引,在相同的列上,以相同的顺序。然而 MySQL Workbench 不允许我删除索引FKOneFKTwo. 我认为我应该能够做到这一点:

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 足够聪明,可以避免创建完全冗余的索引,我不必担心......?

4

1 回答 1

2

(我假设这是在定义模型时。)

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

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

于 2012-06-09T00:08:57.617 回答