4

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

主キーと、2 番目の列に一意のキーがあります。

それらに外部キー制約を作成すると、Workbench は自動的に 2 つのインデックスを追加します。

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

(上記は、外部キーをモデルに追加した後のフォワード エンジニアリング スクリプトです)

現在、4 つのインデックスがあります。

これは、MySQL リファレンス マニュアルに次のように書かれています。

参照テーブルには、外部キー列が同じ順序で最初の列としてリストされているインデックスが必要です。このようなインデックスが存在しない場合は、参照テーブルに自動的に作成されます。

したがって、同じ列に同じ順序で主キーと一意のインデックスが既にあるため、インデックスFKOneとを作成する必要がないことを理解しています。FKTwoしかし、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

私は正しいですか?このコードは機能しますか? ワークベンチでそれを行う方法はありますか? (フォワードエンジニアリングの前の最後の瞬間にこれらの 2 行を削除することは別として)。

あるいは、MySQL は完全に冗長なインデックスの作成を控えるほどスマートであり、私はそれについて心配する必要がないのでしょうか?

4

1 に答える 1

2

(これはモデルを定義するときだと思います。)

Bug 53277を参照してください。ここでは、次のあいまいな回避策について言及しています。

外部キーとそれに対応する、削除したい生成済みインデックスから始めます。キーが(少なくとも一時的に)一意でない単一の列にあることを確認してください。[インデックス] タブで、[タイプ] を [UNIQUE] に変更します。次に、UQ がチェックされている [列] タブに移動し、チェックを外します。不要なインデックスを排除!

于 2012-06-09T00:08:57.617 に答える