我正在使用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很聪明,可以避免创建完全冗余的索引,我不必担心它......?
答案 0 :(得分:2)
(我假设这是在定义模型时。)
请参阅Bug 53277,其中我提到了以下晦涩的解决方法:
您首先要使用外键及其想要删除的相应生成索引。确保密钥(至少暂时)在单个非唯一列上。在“索引”选项卡中,将“类型”更改为“UNIQUE”。然后转到Columns选项卡,现在检查UQ,并取消选中它。消除了不需要的索引!