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

时间:2012-05-26 19:55:35

标签: mysql foreign-keys indexing 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参考手册所说的:

  

在引用表中,必须有一个索引所在的外键   列以相同顺序列为第一列。这样的   如果不是,则会自动在引用表上创建索引   存在。

所以我理解不需要创建索引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很聪明,可以避免创建完全冗余的索引,我不必担心它......?

1 个答案:

答案 0 :(得分:2)

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

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

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