我有以下兩個表:與外鍵1-N的關係是不是主鍵(一次是AUTO_INCREMENT「ID」)與doctrine2/Symfony2的
CREATE TABLE IF NOT EXISTS `skills` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`skill_category` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`skill` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`icon_filename` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`display_priority` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `skill_category` (`skill_category`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `skills_categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`skill_category` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`display_priority` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `IDX_95FF1C8D47E90E27` (`skill_category`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
ALTER TABLE `skills`
ADD CONSTRAINT `skills_ibfk_1` FOREIGN KEY (`skill_category`) REFERENCES `skills_categories` (`skill_category`);
注意兩者之間的外鍵關係skill_category列。
我試圖創建這些表之間的多對一/一對多關係。一個獨特的skill_category應該有很多技能。這種結構似乎做工精細,除了當我嘗試驗證映射我得到的錯誤:
The referenced column name 'skill_category' has to be a primary key column on the target entity class 'Resume\ResumeBundle\Entity\SkillsCategories'.
有由學說的要求所引用的列是主鍵。如果我把這個鍵作爲主鍵,我的id列不再自動增加,我想要的。所以mySQL似乎可以確定外鍵是主鍵,然而Doctrine抱怨這種情況。有人說,他們只是通過重新創建列固定它:
我已經試過這一點,這似乎並沒有幫助我。所以要麼這是某種錯誤,要麼我對RDBMS有一個基本的誤解(完全有可能)。我的問題是我不應該使用'id'列嗎?如果我期望我的'skill_category'列是獨一無二的,那麼我應該把它作爲主鍵並刪除'id'列?這將解決我的問題,但將VARCHAR作爲主鍵會有什麼問題嗎?谷歌的答案似乎「不是真的」,但我希望從別人的角度來看。
感謝您的幫助,我實施了您的解決方案,但後來意識到您正在將'skillId'加入現有的'id'主鍵。我能做到這一點,但爲了便於數據插入(我與phpMyAdmin插入,我寧願不查找每個類別我想使用相應的ID,我寧願只直接使用的範疇,並沒有亂與IDS,如果我這樣做(加入通過類別和表不是IDS),那麼,我需要的類別是主鍵(教義要求),如果我這樣做,那麼IDS慣於增量,如果他們不是主鍵(MySQL的要求?) – Joe
哎呦,是的......我的意思了'Skill' - >'category'加入列名是'categoryId',不'skillId'對此深感抱歉! –
至於你的手動數據庫更新,你可以在phpMyAdmin中執行此操作:INSERT INTO Skill(name,iconFilename,displayPriority,categoryId)選擇「某個技能名稱」,「圖標文件」,5,id FROM Category WHERE name = 「某些類別名稱」?這使用'SELECT'的結果作爲你的'INSERT'的基礎。爲了簡化數據輸入,我只是不確定削弱模型是個好主意。 –