我有两张table, table1
是具有列的父表 ID
以及 table2
有一列 IDFromTable1
(不是真实的名字)当我放上一个fk的时候 IDFromTable1
至 ID
在 table1
我得到了错误 Foreign key constraint is incorrectly formed error
. 我想删除表2记录,如果 table1
记录被删除。谢谢你的帮助
ALTER TABLE `table2`
ADD CONSTRAINT `FK1`
FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`)
ON UPDATE CASCADE
ON DELETE CASCADE;
如果需要其他信息,请告诉我。我是mysql新手
30条答案
按热度按时间bttbmeg01#
检查您是否以正确的大小写指定了表名(如果数据库中的表名区分大小写)。在我的情况下,我必须改变
到
注意
customer
更改为CUSTOMER
.lc8prwob2#
我面临这个问题当您将主键放在不同的数据类型中时出现错误,例如:
表1:
表2:
第二个表的id的数据类型必须是增量
ffvjumwh3#
我和heidisql遇到了同样的问题。你收到的错误很神秘。我的问题是外键列和引用列的类型或长度不同。
外键列无效
SMALLINT(5) UNSIGNED
引用的列是INT(10) UNSIGNED
. 一旦我把它们都做成了相同的类型,外键的创建就完美地工作了。sshcrbum4#
当使用创建父表时,我遇到了相同的问题
MyISAM
引擎。这是个愚蠢的错误,我纠正了:aamkag615#
虽然其他的答案很有帮助,但我也想分享一下我的经验。
当我删除了一个
id
已在其他表(包含数据)中作为外键引用,并尝试重新创建/导入包含其他列的表。娱乐查询(在phpmyadmin中生成)如下所示:
你可能注意到
PRIMARY KEY
索引是在创建(和插入数据)之后设置的,这是导致问题的原因。解决方案
解决方法是添加
PRIMARY KEY
表定义查询的索引id
它被引用为外键,同时也从ALTER TABLE
设置索引的部分:q8l4jmvw6#
我有同样的问题,两列都是int(11)not null,但是我不能创建外键。我必须禁用外键检查才能成功运行:
希望这对别人有帮助。
r9f1avp57#
我也有同样的问题。
问题是引用列不是主键。
把它作为主键,问题就解决了。
pepwfjgg8#
我对symfony2.8也有同样的问题。
一开始我没有明白,因为外键的int长度等方面没有类似的问题。
最后,我不得不在项目文件夹中执行以下操作(服务器重启没有帮助!)
app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result
kdfy810k9#
我的情况是,我提到的专栏有一个拼写错误:
这个错误消息非常神秘,我已经尝试了所有的方法——验证列的类型、排序规则、引擎等等。
我花了一段时间才注意到拼写错误,在修复之后,一切都很顺利:
nsc4cvqm10#
或者可以使用dbdesigner4,它有一个图形界面来创建数据库并使用fk链接它们。右键单击表并选择“copy table sql create”创建代码。
gab6jxml11#
我在使用altertable在两个表之间添加外键时遇到了一些问题,帮助我的是确保要添加外键关系的每一列都被编入索引。在phpmyadmin中这样做:转到表并单击structure选项卡。单击索引选项为所需列编制索引,如屏幕截图所示:
一旦我索引了两个我试图用外键引用的列,我就能够成功地使用alter表并创建外键关系。您将看到列的索引如下面的屏幕截图所示:
注意两个表中都显示了邮政编码。
qvk1mo1f12#
您需要检查两者的所有属性是否相同,包括“排序规则”
qvk1mo1f13#
定义外键的语法是非常宽容的,但是对于任何一个在这个问题上犯错误的人来说,外键必须是“同一类型”这一事实甚至适用于排序规则,而不仅仅是数据类型、长度和位签名。
不是说你会在你的模型中混合排序规则(你会吗?),而是如果你这样做了,确保你的主键和外键字段在phpmyadmin或HeidiSQL或你使用的任何东西中是相同的排序规则类型。
希望这能节省你四个小时的试验和错误,它花费了我。
bwleehnv14#
感谢s doerin:
“只是为了完成。如果外键带有varchar(..),并且引用表的字符集与引用它的表的字符集不同,则也可能出现此错误。e、 g.拉丁1表中的varchar(50)与utf8表中的varchar(50)不同。”
我解决了这个问题,改变了表的字符类型。创建的是拉丁文1,正确的是utf8。
添加下一行。默认字符集=utf8;
rseugnpd15#
我刚才碰到了同样的问题。在我的例子中,我所要做的就是确保我在外键中引用的表必须在当前表之前创建(在代码前面)。因此,如果您引用一个变量(x*5),系统应该知道x是什么(x必须在前面的代码行中声明)。这解决了我的问题,希望能帮助别人。