mysql外键约束错误形成错误

use*_*883 147 mysql sql heidisql

我有两个表,table1是一列父表ID,并table2与一列IDFromTable1(而不是实际的名称),当我把一个FK上IDFromTable1,以IDtable1我得到的错误Foreign key constraint is incorrectly formed error.如果table1记录被删除,我想删除表2记录.谢谢你的帮助

ALTER TABLE `table2`  
   ADD CONSTRAINT `FK1` 
      FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`) 
      ON UPDATE CASCADE 
      ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

如果需要任何其他信息,请与我们联系.我是mysql的新手

Jak*_*son 343

我遇到了与HeidiSQL相同的问题.你收到的错误非常神秘.我的问题最终是外键列和引用列的类型或长度不同.

外键列是SMALLINT(5) UNSIGNED和引用的列INT(10) UNSIGNED.一旦我将它们设置为完全相同的类型,外键创建就完美无缺.

  • 或者可能是引用的列不是主键 (48认同)
  • 对我来说有点类似的问题 - 引用的表还不存在.哎呦. (7认同)
  • 在我的情况下,这是因为不同的编码和整理. (5认同)
  • @nawfal - 我相信它不一定是主键,但它必须有一个索引。主键自动被索引。 (5认同)
  • 我完全体验过Jake的所作所为,但我在HeidiSQL上遇到了另一个FK问题(不同类型).变量的FK需要是相同的排序规则.希望将来帮助别人! (2认同)

Den*_*sky 39

使用MyISAM引擎创建父表时,我遇到了同样的问题.这是一个愚蠢的错误,我修复了:

ALTER TABLE parent_table ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)


小智 34

对于遇到此问题的任何人,只需运行 SHOW ENGINE INNODB STATUS 并查看最新的外键错误部分以获取详细信息。

  • 谢谢,它节省了我几个小时 (2认同)
  • 确实!这感觉确实应该是公认的答案,因为它显示了它实际上的问题所在,而不是仅仅列出一两个可能发生这种情况的原因。 (2认同)
  • 太棒了,这让我遇到了真正的错误:“列‘vehicle_id’的字段类型或字符集与引用的列‘id’不匹配” (2认同)

小智 25

确保列是相同的(相同类型),如果列不相同primary_key,请确保它是INDEXED.

  • 没有索引的键是我的问题。 (2认同)
  • 我遇到了这个问题,问题是我有一个双列主键,并且您不能使用主键的第二列作为外键。所以我只是为主键的第二列添加了自己的索引,然后它就起作用了。 (2认同)

小智 20

定义外键的语法是非常宽容的,但是对于其他任何人来说,外键必须是"相同类型"的事实甚至适用于整理,而不仅仅是数据类型和长度以及位签名.

并不是说您在模型中混合了排序规则(不是吗?)但是如果这样做,请确保您的主键和外键字段在phpmyadmin或Heidi SQL或您使用的任何类型中具有相同的排序规则类型.

希望这能为您节省四个小时的试用和错误.


小智 10

刚完成.

如果您使用VARCHAR(..)的外键并且引用的表的字符集与引用它的表不同,则此错误也可能是这种情况.

例如,Latin1表中的VARCHAR(50)与UTF8表中的VARCHAR(50)不同.


jos*_*sef 10

如果一切正常,只需->unsigned();foregin key.

如果它不起作用,请检查两个字段的数据类型。它们必须相同。


Ren*_*tin 10

我有同样的问题,但解决了它.

只需确保'table1'中的列'ID'具有UNIQUE索引!

当然,这两个表中列'ID'和'IDFromTable1'的类型,长度必须相同.但是你已经知道了这一点.

  • 乐意效劳!;) (2认同)

Luc*_* C. 9

mysql错误文本没那么大帮助,在我的情况下,列有"not null"约束,所以不允许"on delete set null"

  • 那就是那个,非常感谢! (2认同)

Kay*_*ast 9

显示此错误的另一个可能原因。我创建表格的顺序是错误的。我试图从尚未创建的表中引用一个键。


小智 7

Laravel当您在引用外键表的table1迁移之后进行外键表迁移时,也会出现此问题table2

您必须保留迁移的顺序才能使foreign key功能正常工作。

database/migrations/2020_01_01_00001_create_table2_table.php
database/migrations/2020_01_01_00002_create_table1_table.php
Run Code Online (Sandbox Code Playgroud)

应该:

database/migrations/2020_01_01_00001_create_table1_table.php
database/migrations/2020_01_01_00002_create_table2_table.php
Run Code Online (Sandbox Code Playgroud)


小智 6

(Last Resent) 即使字段名称和数据类型相同但排序规则不相同,也会导致该问题。

例如

    TBL 名称 | 数据类型 | 整理        

    活动ID | 国际 |         latin1_general_ci     ActivityID | 国际 |         utf8_general_ci

试试改成

    TBL 名称 | 数据类型 | 整理        

    活动ID | 国际 |         latin1_general_ci     ActivityID | 国际 |         latin1_general_ci

....

这对我有用。


小智 5

检查表引擎,两个表必须是同一个引擎,这对我帮助很大。


Tak*_*man 5

我遇到了同样的问题,两列均为INT(11)NOT NULL,但我无法创建外键。我必须禁用外键检查才能成功运行它:

SET FOREIGN_KEY_CHECKS=OFF;
ALTER TABLE ... ADD CONSTRAINT ...
SET FOREIGN_KEY_CHECKS=ON;
Run Code Online (Sandbox Code Playgroud)

希望这对某人有帮助。

  • 其实是FOREIGN_KEY_CHECKS (4认同)