MySQL 5.5.9的奇怪外键问题

时间:2011-03-17 11:41:05

标签: mysql database doctrine foreign-keys ddl

我遇到了一个相当奇怪的外键问题,即这不能按预期工作:

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;

1 个答案:

答案 0 :(得分:1)

如果您使用的是Mac OS X,则可能会遇到MySQL中的错误:
MySQL 5.5 foreign key constraint fails when foreign key exists