热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

我正在使用Workbench创建数据库模型并创建下表:CREATETABLEIFNOTEXISTS`Database`.`table1`(`i

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

In the referencing table, there must be an index where the foreign key

columns are listed as the first columns in the same order. Such an

index is created on the referencing table automatically if it does not

exist.

所以我理解不需要创建索引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可能足够智能,不会创建完全冗余的索引,我不必担心它……?

解决方法:

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

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

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


推荐阅读
author-avatar
深碍是碍u不是爱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有