次の2つのテーブルがあります。
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`);
2 つの skill_category 列間の外部キーの関係に注意してください。
これらのテーブル間に多対一/一対多の関係を作成しようとしています。1 つの固有の skill_category には、多くのスキルが必要です。この構造は正常に動作しているように見えますが、マッピングを検証しようとするとエラーが発生します。
参照される列名 'skill_category' は、ターゲット エンティティ クラス 'Resume\ResumeBundle\Entity\SkillsCategories' の主キー列である必要があります。
参照される列が主キーであるという原則による要件があります。このキーを主キーにすると、id 列が自動的にインクリメントされなくなります。したがって、mySQL は外部キーが主キーであるという事実に問題ないように見えますが、Doctrine はこのケースについて不平を言っています。列を再作成するだけで修正したと誰かが言った:
私はこれを試しましたが、私には役に立たなかったようです。したがって、これはある種のバグであるか、RDBMS の基本的な誤解があります (完全に可能性があります)。「id」列をまったく使用すべきではないという私の問題ですか? 「skills_category」列が一意であると予想される場合、それを主キーにして「id」列を削除する必要がありますか? これで問題は解決しますが、VARCHAR を主キーにすることに問題はありますか? Googleの答えは「そうではない」ようですが、他の誰かからの視点をいただければ幸いです.