mysql - MySQL 5.5.9 的奇怪外键问题

标签 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`);

(上面相同 key 的 phpMyAdmin 导出)

问题本身表现为,如果键是用第一个 block 中的 SQL 定义的,MySQL 将不允许我向表中插入任何内容,提示引用完整性(即使引用的条目存在),但如果我使用第二个 block 中的 SQL 设置键。

我知道我可以使用后一个关键定义 SQL“继续并快乐”,但我更愿意以某种方式坚持使用 Doctrine 生成的 SQL,因为我仍处于开发初期并且模型会经常更改(因此两步手动 key 修复会变得相当烦人)。

编辑

这是创建语句

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;

最佳答案

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

关于mysql - MySQL 5.5.9 的奇怪外键问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5338504/

相关文章:

php - SQL 连接/Doctrine/Symfony2 : Only getting one result from join when I expect multiple

caching - 在Symfony2/Doctrine中清除查询缓存

java - 使用 EclipseLink 将行插入到具有唯一标识符列的表中

php - 替代 MySQL 中的大量 bool 值?

php - 包含数据库完整性

javascript - 使用 Javascript 初始化数据与使用 MySQL 进行数据检索之间的性能差异?

php - Doctrine2如何处理回滚后更新实体? ("The EntityManager is closed")

CakePHP - 分页/查询 : find lowest of multiple fields & order by it

database - PostgreSQL 错误 : process still waiting for AccessShareLock on relation 2676 of database 0

MySQL 数据库模式创建者和所有者关系?例如用户和媒体?