我的客户最近格式化了他的机器并重新安装了MySQL服务器和我的应用程序。他抱怨说从主表中删除记录不会影响子表。我请他发送数据库的备份。当我恢复数据库时,我发现表引擎已更改为MyISAM,而它们已设置为InnoDB。
我从子表中删除了主表中不存在的记录。在此之后,当我没有重新设置外键索引时,它显示错误:“外键约束失败。错误1005”,有时错误:150。
我已经仔细检查了可能留在主表或子表中的行,但似乎没有任何工作。
主表有两列组合形成主键。列是:BillNo,BillDate。
请协助。
答案 0 :(得分:4)
这是众所周知的MySQL陷阱;我自己曾经多次遇到过这个问题。他们可能在InnoDB上遇到了一些问题,并从备份中恢复了数据库。由于InnoDB无法正常工作,因此它回退到MyISAM存储引擎,该引擎不支持完整性约束(如外键)。
基本上问题是,如果InnoDB引擎由于某种原因(通常是配置问题)无法启动 - 那么MySQL会默默地回退到MyISAM引擎。即使你的陈述说:
CREATE TABLE () ENGINE=InnoDB
然后,如果InnoDB没有激活,MySQL将很乐意创建一个MyISAM表,甚至不会警告你。再见数据完整性! :)
您可以运行SHOW ENGINES
以查看哪些引擎处于活动状态。有关详细信息,请参阅this MySQL bug report。
答案 1 :(得分:1)
检查您是否正在为两个表使用InnoDB引擎。
检查两个字段是否属于同一类型并且已将其编入索引。
来自http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html:
如果你重新创建一个表 掉线了,它必须有一个定义 符合外键 引用它的约束。它必须 拥有正确的列名称和类型, 它必须有索引 如前所述,引用的密钥。如果 这些都不满意,MySQL返回 错误号1005并指错误 150错误信息。