我遇到了一个相当奇怪的外键问题,即这不能按预期工作:
ALTER TABLE contact_contactlist
ADD FOREIGN KEY (contact_id) REFERENCES contacts(id) ON DELETE CASCADE;
ALTER TABLE contact_contactlist
ADD FOREIGN KEY (contactlist_id) REFERENCES contactLists(id) ON DELETE CASCADE;
ALTER TABLE contactLists
ADD FOREIGN KEY (owner_id) REFERENCES serviceAccounts(id);
(由Doctrine 2自动生成)
然而,这完美无缺:
ALTER TABLE `contact_contactlist`
ADD CONSTRAINT `contact_contactlist_ibfk_5`
FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `contact_contactlist_ibfk_6`
FOREIGN KEY (`contactlist_id`) REFERENCES `contactLists` (`id`) ON DELETE CASCADE;
ALTER TABLE `contactLists`
ADD CONSTRAINT `contactlists_ibfk_1`
FOREIGN KEY (`owner_id`) REFERENCES `serviceAccounts` (`id`);
(phpMyAdmin导出上面相同的键)
问题表现在MySQL不会让我在表中插入任何内容,如果用第一个块中的SQL定义键,抱怨引用完整性(即使引用的条目存在),但是如果我使用第二个块中的SQL设置了键。
我知道我可以使用后一个关键定义SQL“继续并且开心”,但我更愿意,如果我能够以某种方式坚持Doctrine生成的SQL,因为我还处于早期开发阶段,模型会经常变化(因此两步手动键修复会变得相当烦人)。
修改
以下是创建语句
CREATE TABLE contact_contactlist (
contact_id BIGINT NOT NULL,
contactlist_id BIGINT NOT NULL,
INDEX contact_contactlist_contact_id_idx (contact_id),
INDEX contact_contactlist_contactlist_id_idx (contactlist_id),
PRIMARY KEY(contact_id, contactlist_id))
ENGINE = InnoDB;
CREATE TABLE contactLists (
id BIGINT AUTO_INCREMENT NOT NULL,
owner_id INT DEFAULT NULL,
name VARCHAR(255) NOT NULL,
INDEX contactLists_owner_id_idx (owner_id),
PRIMARY KEY(id))
ENGINE = InnoDB;
答案 0 :(得分:1)
如果您使用的是Mac OS X,则可能会遇到MySQL中的错误:
MySQL 5.5 foreign key constraint fails when foreign key exists