2014-02-26 55 views
0

更新:我有一票到我的託管服務提供商(的FatCow),因爲他們能夠複製的問題。我會在這裏發表任何結論。phpMyAdmin拋出No Index Defined!即使索引和PK的存在

我有一個MySQL數據庫,像這樣:

table || pk 
----------- 
performers -> pID 
genres -> gID 
venues -> vID 

我也有一個事件表看起來是這樣的:

eID (PK) 
ePerformer (INDEX) 
eGenre (INDEX) 
eVenue (INDEX) 

他們都是同一類型:INT(11)。所有的表格都是InnoDB。我想設置的關係,phpMyAdmin使用的事件表的關係視圖,但是當我嘗試保存:

ePerformer: performers->pID ON DELETE RESTRICT, ON UPDATE RESTRICT 
eGenre: genres->gID ON DELETE RESTRICT, ON UPDATE RESTRICT 
etc... 

我得到這個錯誤回到每個字段:No index defined!

我想也許我是做它倒退,所以我嘗試設置其他表中的每個關係,但我得到同樣的錯誤。

什麼給?

回答

1

使用類似的結構,我能夠創造的關係。你已經檢查了幾個明顯的東西(引用鍵上的主鍵,InnoDB等)。

當我第一次創建events表時,使用phpMyAdmin下拉菜單爲您指示的三個字段中的每一個選擇INDEX,它在所有三個字段上都創建了一個複合索引,這些索引不起作用;我不得不刪除該索引,並手動在每個字段上分別創建一個INDEX。

綜合指數: The composite index that doesn't work

工作各個索引:

Individual indexes that do work

你可以嘗試設計功能(該功能需要您設置了 「phpMyAdmin configuration storage」);操縱關係時,我發現它優於關係視圖。

events表(我知道,你已經說你是在正確的表),單擊結構標籤和未來的關係視圖鏈接,您應該能夠做到這一點:

Relation view example

在這種情況下,我已經創造了通過設計師和fk_venue通過關係查閱events_ibfk_1關係;這個截圖被帶到之前,爲了創建一個fk_performer所以你在這裏看到的正是我在的地方點擊「保存」之前。

不知道有沒有什麼幫助任何,但我能與您提供該做些什麼呢?所以也許如果仍然不工作,你可以導出您完成現有的表結構,我會盡力做這個工作。

對於它的價值,這裏的表結構我工作的出口:

 
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 

CREATE TABLE IF NOT EXISTS `events` (
    `eID` int(11) NOT NULL, 
    `ePerformer` int(11) NOT NULL, 
    `eGenre` int(11) NOT NULL, 
    `eVenue` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE IF NOT EXISTS `genres` (
    `gID` int(11) NOT NULL, 
    `g` varchar(255) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE IF NOT EXISTS `performers` (
    `pID` int(11) NOT NULL, 
    `p` varchar(255) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE IF NOT EXISTS `venues` (
    `vID` int(11) NOT NULL, 
    `v` varchar(255) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


ALTER TABLE `events` 
ADD PRIMARY KEY (`eID`), ADD KEY `i_perf` (`ePerformer`), ADD KEY `i_genre` (`eGenre`), ADD KEY `i_venue` (`eVenue`); 

ALTER TABLE `genres` 
ADD PRIMARY KEY (`gID`); 

ALTER TABLE `performers` 
ADD PRIMARY KEY (`pID`); 

ALTER TABLE `venues` 
ADD PRIMARY KEY (`vID`); 


ALTER TABLE `events` 
ADD CONSTRAINT `fk_performer` FOREIGN KEY (`ePerformer`) REFERENCES `performers` (`pID`), 
ADD CONSTRAINT `events_ibfk_1` FOREIGN KEY (`eGenre`) REFERENCES `genres` (`gID`), 
ADD CONSTRAINT `fk_venue` FOREIGN KEY (`eVenue`) REFERENCES `venues` (`vID`); 
+0

真是一個偉大的和詳細的解答。看起來你使用的是比我更新的phpMyAdmin版本。當我有機會時,我可以簡單地嘗試運行SQL命令。我不知道這是否會有所作爲,但數據庫表是從我的生產機器導入的。我使用.SQL擴展名導出/導入。如果MySQL服務器是不同的版本,這會導致意想不到的問題嗎?我只是想弄清楚爲什麼會發生這種情況。 此外,我確定不使用組合鍵,這是一個很好的事情,在你的答案中指出。 – armadadrive

+0

我剛剛放棄了我的整個數據庫,認爲它可能是腐敗的。我使用上面演示的相同命令從phpMyAdmin重建它。當我進入關係視圖來設置更新和刪除的默認操作時,我可以看到外鍵被設置爲引用正確的主鍵。當我試圖添加RESTRICT作爲更新和刪除操作時,我得到了相同的原始錯誤!當我再次點擊關係視圖時,約束消失了。 – armadadrive

相關問題