2

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

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

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

主表有两列组合形成主键。这些列是:BillNo、BillDate。

请协助。

4

2 回答 2

4

这是一个广为人知的 MySQL 陷阱。我自己也遇到过几次这个问题。他们可能对 InnoDB 有一些问题,并从备份中恢复了他们的数据库。由于 InnoDB 不工作,它退回到不支持完整性约束(如外键)的 MyISAM 存储引擎。

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

CREATE TABLE () ENGINE=InnoDB

然后,如果 InnoDB 不活动,MySQL 会很高兴地创建一个 MyISAM 表,甚至不会警告你。再见数据完整性!:)

您可以运行SHOW ENGINES以查看哪些引擎处于活动状态。有关更多详细信息,请参阅此 MySQL 错误报告

于 2009-11-19T10:49:08.477 回答
1
  1. 检查您是否对两个表都使用了 InnoDB 引擎。

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

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

如果您重新创建已删除的表,则它必须具有符合引用它的外键约束的定义。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果这些不满足,MySQL 返回错误号 1005 并在错误消息中引用错误 150。

于 2009-11-19T10:51:35.557 回答