我創造與工作臺數據庫模型,並創建下表:創建已建立索引的列外鍵與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參考手冊說:
在引用表中,必須有地方外鍵 列列爲同一順序的第一列的索引。如果它不存在 ,則會在引用表上自動創建這樣一個 索引。
所以我知道有沒有必要創建索引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足夠聰明,避免創建完全冗餘的索引,我不必擔心它......?
這兩列實際上是否引用同一個表中的同一列 - 或者是一個錯字? –
是的,它們引用同一個表中的同一列,這迫使我在更新引用列之前刪除行!但這與這個問題無關。也許我應該選擇另一個例子。 – Dil
不,沒關係。通常有2列引用同一個 - 就像定義父子層次結構時一樣。獨特的約束讓我困惑了一會兒。 (順便說一句,我也遇到過與Workbench一樣的麻煩)。 –