我有以下两个表:
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”必须是目标实体类“Resume\ResumeBundle\Entity\SkillsCategories”上的主键列。
学说要求被引用的列是主键。如果我将此键设为主键,我的 id 列将不再自动递增,这是我想要的。所以 mySQL 似乎可以接受外键是主键的事实,但是 Doctrine 抱怨这种情况。有人说他们只是通过重新创建列来修复它:
我试过这个,它似乎对我没有帮助。所以要么这是某种错误,要么我对 RDBMS 有根本的误解(完全可能)。我的问题是我根本不应该使用“id”列吗?如果我希望我的 'skills_category' 列是唯一的,我应该将其作为主键并删除 'id' 列?那将解决我的问题,但是将 VARCHAR 作为主键有什么问题吗?谷歌的答案似乎是“不是真的”,但我希望能从其他人那里获得一些观点。