MySQL外键问题

时间:2009-11-19 10:42:16

标签: mysql constraints innodb myisam

我的客户最近格式化了他的机器并重新安装了MySQL服务器和我的应用程序。他抱怨说从主表中删除记录不会影响子表。我请他发送数据库的备份。当我恢复数据库时,我发现表引擎已更改为MyISAM,而它们已设置为InnoDB。

我从子表中删除了主表中不存在的记录。在此之后,当我没有重新设置外键索引时,它显示错误:“外键约束失败。错误1005”,有时错误:150。

我已经仔细检查了可能留在主表或子表中的行,但似乎没有任何工作。

主表有两列组合形成主键。列是:BillNo,BillDate。

请协助。

2 个答案:

答案 0 :(得分:4)

这是众所周知的MySQL陷阱;我自己曾经多次遇到过这个问题。他们可能在InnoDB上遇到了一些问题,并从备份中恢复了数据库。由于InnoDB无法正常工作,因此它回退到MyISAM存储引擎,该引擎不支持完整性约束(如外键)。

基本上问题是,如果InnoDB引擎由于某种原因(通常是配置问题)无法启动 - 那么MySQL会默默地回退到MyISAM引擎。即使你的陈述说:

CREATE TABLE () ENGINE=InnoDB

然后,如果InnoDB没有激活,MySQL将很乐意创建一个MyISAM表,甚至不会警告你。再见数据完整性! :)

您可以运行SHOW ENGINES以查看哪些引擎处于活动状态。有关详细信息,请参阅this MySQL bug report

答案 1 :(得分:1)

  1. 检查您是否正在为两个表使用InnoDB引擎。

  2. 检查两个字段是否属于同一类型并且已将其编入索引。

  3. 来自http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

      

    如果你重新创建一个表   掉线了,它必须有一个定义   符合外键   引用它的约束。它必须   拥有正确的列名称和类型,   它必须有索引   如前所述,引用的密钥。如果   这些都不满意,MySQL返回   错误号1005并指错误   150错误信息。