【问题标题】:Can't create FOREIGN KEY CONSTRAINT in MySQL无法在 MySQL 中创建 FOREIGN KEY CONSTRAINT
【发布时间】:2014-01-02 08:22:07
【问题描述】:

我在 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' (errno: 150) (详细信息...)

当我点击详细信息时,我得到了这个:

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

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

【问题讨论】:

标签: mysql phpmyadmin foreign-keys


【解决方案1】:

这里可能有几件事。以下是一些需要注意的事项:

  • 表之间每个字段的数据类型是否匹配?
  • 两个表是否使用相同的 MySQL 引擎?

Here 是帮助您进一步调试此问题的好资源。

摘自以上链接的资源:

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 和 Collat​​e 选项在表级别以及关键列的单个字段级别都相同。

7) 你的外键列有一个默认值(即默认值=0)。

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

9) 您的 ALTER 语句中有语法错误,或者您在关系中输入了错误的字段名称之一。

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

【讨论】:

  • 以上似乎都不是我的问题,但我认为它们都是正确的答案。会不会是我的 FK 失败了,因为已经有另一个孩子的 FK 指向同一个父母?另外:链接坏了:(
  • 您可能包括某些字段是否具有“USING BTREE”而其他字段没有(或其他算法名称)。我刚刚把头撞在键盘上三个小时来追踪它。感谢 HeidiSQL >
【解决方案2】:

User.ID 必须声明为 INDEX

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多