我有两个表,table1是一个列ID的父表,table2是一个列IDFromTable1(不是实际的名称),当我把一个FK IDFromTable1到ID在table1,我得到的错误外键约束是不正确形成的错误。我想删除表2记录,如果表1记录被删除。谢谢你的帮助

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

如果还需要其他信息,请告诉我。我是mysql的新手


当前回答

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

例如

资源描述 name | data 类型           | 排序 ActivityID           |         INT                         | latin1_general_ci ActivityID           |         INT                         | utf8_general_ci

试着把它变成

资源描述 name | data 类型           | 排序 ActivityID           |         INT                         | latin1_general_ci ActivityID           |         INT                         | latin1_general_ci

....

这对我很管用。

其他回答

我在Symfony 2.8上也遇到了同样的问题。

我一开始没有得到它,因为外键的int长度等没有类似的问题。

最后,我必须在项目文件夹中执行以下操作。(服务器重启不起作用!)

应用程序/控制台学说:缓存:clear-metadata 应用程序/控制台学说:缓存:clear-query 应用程序/控制台学说:缓存:明确的结果

我正在使用HeidiSQL,为了解决这个问题,我必须在引用表中创建一个索引,其中所有列都被引用。

如果一切正常,只需添加->unsigned();在外键的末尾。

如果不行,请检查两个字段的数据类型。它们必须是一样的。

我有同样的问题,两列都是INT(11) NOT NULL,但我不能创建外键。 我必须禁用外键检查才能成功运行:

SET FOREIGN_KEY_CHECKS=OFF;
ALTER TABLE ... ADD CONSTRAINT ...
SET FOREIGN_KEY_CHECKS=ON;

希望这能帮助到一些人。

谢谢S Doerin:

“只是为了完成。 如果你有一个VARCHAR(..)外键,并且被引用的表的字符集与引用它的表的字符集不同,也可能会出现这个错误。 例如,Latin1表中的VARCHAR(50)与UTF8表中的VARCHAR(50)不同。

我解决了这个问题,改变了表格的字符类型。 创建的是latin1,正确的是utf8。

添加下一行。 默认字符集= utf8;