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

使用MySQL Workbench在已索引的列上创建外键,mysql,foreign-keys,indexing,mysql-workbench,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) )
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
FKTOW
。我想我应该能够做到这一点:

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

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

请看,我在这里提到了以下晦涩难懂的解决方法:


首先是一个外键及其相应的生成的索引,您希望删除它。确保键(至少暂时)位于单个非唯一列上。在“索引”选项卡中,将类型更改为“唯一”。然后转到Columns选项卡,此时选中UQ,然后取消选中它。删除了不需要的索引

是的,就是这样!非常感谢你!!我试图在不创建任何其他索引的情况下创建外键,然后将生成的索引更改为Unique和Primary。可以更改为Unique,但不能更改为Primary。但是,您的解决方案可以适应任何情况,因为它会完全删除生成的索引。让我印象深刻的是,它似乎是基于另一个bug,因为人们可能会认为取消勾选UQ列会导致该列上的任何唯一索引返回到索引,不要消失。现在我可以维护数据库的精确模型,忘记编辑正向工程脚本。这两列是否都引用了同一表中的同一列?或者这是打字错误?是的,它们引用了同一表中的同一列,这迫使我在更新引用列之前删除该行!不过,这与这个问题无关。也许我应该选择另一个例子。不,没关系。定义父子层次结构时,通常会有两列引用同一列。这些独特的限制让我一时糊涂。(顺便说一句,我的工作台也有同样的问题)。