3 回答
TA贡献1828条经验 获得超3个赞
错误代码:1005 - 代码中的主键引用错误
通常是由于引用的外键字段不存在。可能是你有一个拼写错误,或者检查它应该是相同的,或者是字段类型不匹配。外键链接字段必须与定义完全匹配。
一些已知的原因可能是:
两个关键字段类型和/或大小不完全匹配。例如,如果一个是
INT(10)
关键字段需要INT(10)
也是,而不是INT(11)
或TINYINT
。您可能需要确认字段大小,SHOW
CREATE
TABLE
因为查询浏览器有时会直观地显示INTEGER
两者INT(10)
和INT(11)
。你还应该检查一个不是SIGNED
,另一个是UNSIGNED
。它们都需要完全相同。您尝试引用的关键字段之一没有索引和/或不是主键。如果关系中的某个字段不是主键,则必须为该字段创建索引。
外键名称是已存在键的副本。检查外键的名称在数据库中是否唯一。只需在密钥名称的末尾添加一些随机字符即可对其进行测试。
您的一个或两个表是一个
MyISAM
表。为了使用外键,表必须都是InnoDB
。(实际上,如果两个表都是,MyISAM
那么您将不会收到错误消息 - 它只是不会创建密钥。)在查询浏览器中,您可以指定表类型。您已指定级联
ON
DELETE
SET
NULL
,但相关键字段设置为NOT
NULL
。您可以通过更改级联或将字段设置为允许NULL
值来解决此问题。确保Charset和Collate选项在表级别以及关键列的单个字段级别都相同。
外键列上有一个默认值(即默认值= 0)
关系中的一个字段是组合(复合)键的一部分,并且没有自己的单独索引。即使该字段具有索引作为复合键的一部分,您也必须仅为该键字段创建单独的索引,以便在约束中使用它。
您的
ALTER
语句中存在语法错误,或者您在关系中输入了一个字段名称外键的名称超过64个字符的最大长度。
TA贡献1818条经验 获得超8个赞
将数据库从一个服务器导出到另一个服务器时,也可能发生这种情况,默认情况下,这些表按字母顺序列出。
因此,您的第一个表可能具有另一个尚未创建的表的外键。在这种情况下,请禁用foreign_key_checks并创建数据库。
只需将以下内容添加到脚本中:
SET FOREIGN_KEY_CHECKS=0;
它应该工作。
TA贡献2037条经验 获得超6个赞
有时它是由于主表被删除(可能是通过禁用foreign_key_checks),但外键CONSTRAINT仍然存在于其他表中。在我的情况下,我放弃了桌子并尝试重新创建它,但它给我带来了同样的错误。
因此,尝试从所有表中删除所有外键CONSTRAINT(如果有),然后更新或创建表。
添加回答
举报