2012-05-26 123 views
4

我創造與工作臺數據庫模型,並創建下表:創建已建立索引的列外鍵與MySQL工作臺

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 

它有一個主鍵,在我的第二列的唯一密鑰。

當我在其上創建外鍵約束,工作臺自動增加了兩個指標:

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足夠聰明,避免創建完全冗餘的索引,我不必擔心它......?

+0

這兩列實際上是否引用同一個表中的同一列 - 或者是一個錯字? –

+0

是的,它們引用同一個表中的同一列,這迫使我在更新引用列之前刪除行!但這與這個問題無關。也許我應該選擇另一個例子。 – Dil

+0

不,沒關係。通常有2列引用同一個 - 就像定義父子層次結構時一樣。獨特的約束讓我困惑了一會兒。 (順便說一句,我也遇到過與Workbench一樣的麻煩)。 –

回答

2

(我定義模型時,假設這是)。

Bug 53277,在這裏我提以下晦澀的解決方法:

開始時你有外鍵及其相應的要生成的索引擺脫。確保密鑰(至少暫時)在單個非唯一列上。在索引選項卡中,將類型更改爲UNIQUE。然後進入列選項卡,其中UQ現在被檢查,並取消選中它。不需要的索引被消除!

+0

是的,就是這樣!非常感謝你!!我試圖創建外鍵而不創建任何其他索引,然後將生成的索引更改爲唯一和主鍵。更改爲唯一可能,但不能更改爲主。但是,您的解決方案適用於任何情況,因爲它會完全刪除生成的索引。令我感到震驚的是,它似乎基於另一個bug,因爲人們認爲取消檢查UQ列會導致該列上的任何UNIQUE索引返回到INDEX,而不會消失。 – Dil

+0

現在我可以維護數據庫的確切模型,並忘記編輯正向工程腳本。 – Dil