繁体   English   中英

MySQL外键问题

[英]MySQL foreign key problem

我的一个客户最近格式化了他的计算机,然后重新安装了MySQL Server和我的应用程序。 他抱怨说,从主表中删除记录不会影响子表。 我要求他发送数据库备份。 还原数据库时,我发现表引擎已更改为MyISAM,而将它们设置为InnoDB。

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

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

主表有两列,它们共同构成一个主键。 这些列是:BillNo,BillDate。

请协助。

这是众所周知的MySQL陷阱。 我本人几次遇到这个问题。 他们可能在使用InnoDB时遇到了问题,并从备份还原了数据库。 由于InnoDB无法正常工作,因此它只能使用MyISAM存储引擎,该引擎不支持完整性约束(例如外键)。

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

CREATE TABLE () ENGINE=InnoDB

然后,如果InnoDB处于非活动状态,MySQL将愉快地创建MyISAM表,甚至不会警告您。 再见数据完整性! :)

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

  1. 检查两个表是否都使用InnoDB引擎。

  2. 检查两个字段是否具有相同的类型并对其进行索引。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM