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 では、インデックス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
私は正しいですか?このコードは機能しますか? ワークベンチでそれを行う方法はありますか? (フォワードエンジニアリングの前の最後の瞬間にこれらの 2 行を削除することは別として)。
あるいは、MySQL は完全に冗長なインデックスの作成を控えるほどスマートであり、私はそれについて心配する必要がないのでしょうか?