【问题标题】:Creating foreign keys on already indexed columns with MySQL Workbench使用 MySQL Workbench 在已建立索引的列上创建外键
【发布时间】: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 参考手册所说的:

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

所以我知道没有必要创建索引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 足够聪明,可以避免创建完全冗余的索引,而我不必担心......?

【问题讨论】:

  • 这两列是否实际上引用了同一个表中的同一列 - 或者这是一个错字?
  • 是的,它们引用了同一个表中的同一列,这迫使我在更新引用的列之前删除该行!不过,这与这个问题无关。也许我应该选择另一个例子。
  • 不,没关系。通常有 2 列引用同一个列 - 就像定义父子层次结构时一样。 Unique 约束让我一时糊涂。 (顺便说一句,我也有同样的麻烦,工作台)。

标签: mysql foreign-keys indexing mysql-workbench


【解决方案1】:

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

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

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

【讨论】:

  • 是的,就是这样!非常感谢!!我试图创建外键而不先创建任何其他索引,然后将生成的索引更改为唯一和主索引。可以更改为唯一,但不能更改为主要。但是,您的解决方案适用于任何情况,因为它完全删除了生成的索引。令我印象深刻的是,它似乎是基于另一个错误,因为人们认为取消检查 UQ 列会导致该列上的任何 UNIQUE 索引返回到 INDEX,而不是消失。
  • 现在我可以维护数据库的精确模型,而无需编辑前向工程脚本。
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 2020-08-14
  • 2020-05-04
  • 2018-10-14
  • 2020-04-16
  • 1970-01-01
  • 2020-06-20
  • 2016-01-15
相关资源
最近更新 更多