无法在MySQL中创建外键约束

6

我使用Ubuntu中的phpMyAdmin 3.5.8.1deb1创建了我的MySQL数据库。

但是,所有我的表都是InnoDB类型,我无法添加外键。以下是一个示例:

ALTER TABLE element ADD CONSTRAINT FK_element_id_user FOREIGN KEY (id_user) REFERENCES user(id) ON DELETE SET NULL ON UPDATE CASCADE;

当我运行这个脚本时,出现了以下错误:

#1005 - 无法创建表 'tpw.#sql-4d8_e2'(错误编号:150)(详细信息...)

当我点击详细信息时,显示如下内容:

InnoDB文档支持事务、行级锁定和外键

我尝试在关系视图中手动添加外键。

你能告诉我们相关领域的定义是什么吗?就像@kkumar9844一样,我怀疑它们不匹配。 - DaSourcerer
https://dev59.com/bm855IYBdhLWcg3w-JMr - Nouphal.M
2个回答

12
可能有几个问题。以下是一些要注意的事项:
  • 两个表之间的每个字段的数据类型是否匹配?
  • 这两个表是否都使用相同的MySQL引擎?

这里是一个很好的资源,可以帮助您进一步调试此问题。

从上面链接的资源摘录:

1)两个关键字段的类型和/或大小不匹配。例如,如果其中一个是INT(10),则关键字段也需要是INT(10),而不是INT(11)或TINYINT。您可以使用SHOW CREATE TABLE确认字段大小,因为查询浏览器有时只会在INT(10)和INT(11)中显示INTEGER。您还应检查一个字段是否已签名,而另一个字段未签名。它们必须完全相同。

2)您正在尝试引用的关键字段之一没有索引和/或不是主键。如果关系中的某个字段不是主键,则必须为该字段创建索引。

3)外键名称与已存在的键重复。检查您的外键名称在数据库中是否唯一。只需在键名称的末尾添加一些随机字符即可测试它。

4)您的一个或两个表是MyISAM表。为了使用外键,这两个表都必须是InnoDB。(实际上,如果两个表都是MyISAM,则不会收到错误消息-它只是不会创建关键字。)在查询浏览器中,您可以指定表类型。

5)您已指定级联ON DELETE SET NULL,但相关键字段设置为NOT NULL。您可以通过更改级联或设置该字段允许NULL值来解决此问题。

6) 确保表级别和关键列的个别字段级别的Charset和Collate选项相同。

7) 外键列有一个默认值(例如default=0)。

8) 关系中的某个字段是组合(复合)键的一部分,并且没有它自己的单独索引。即使该字段作为组合键的一部分具有索引,您也必须为该键字段创建一个单独的索引才能在约束中使用它。

9) ALTER语句中存在语法错误或者关系中的某个字段名称拼写错误。

10) 您的外键名称超过了64个字符的最大长度。


以上都不是我的问题所在,但我会认为它们都是正确的答案。可能是因为已经有另一个子项与指向同一父项的FK相关联,导致我的FK失败了吗?另外:链接已经损坏了 :( - Wouter Vanherck
你可能会包含一些字段是否有“USING BTREE”(或另一个算法名称)。我刚刚花了三个小时去跟踪那个问题,感谢 HeidiSQL >< - Stewii

0

User.ID必须声明为索引


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接