【发布时间】:2012-06-01 21:58:19
【问题描述】:
我正在使用 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 足够聪明,可以避免创建完全冗余的索引,而我不必担心......?
【问题讨论】:
-
这两列是否实际上引用了同一个表中的同一列 - 或者这是一个错字?
-
是的,它们引用了同一个表中的同一列,这迫使我在更新引用的列之前删除该行!不过,这与这个问题无关。也许我应该选择另一个例子。
-
不,没关系。通常有 2 列引用同一个列 - 就像定义父子层次结构时一样。 Unique 约束让我一时糊涂。 (顺便说一句,我也有同样的麻烦,工作台)。
标签: mysql foreign-keys indexing mysql-workbench