我有两张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条答案
按热度按时间ac1kyiln16#
我对laravel5.1迁移模式生成器和mariadb10.1有同样的问题。
问题是我打字了
unigned
而不是unsigned
(the)s
设置列时丢失了字母)。在修正了排版错误之后,我就修正了。
guykilcj17#
我在使用altertable在两个表之间添加外键时遇到了一些问题,帮助我的是确保要添加外键关系的每一列都被编入索引。在phpmyadmin中这样做:转到表并单击structure选项卡。单击索引选项为所需列编制索引,如屏幕截图所示:
一旦我索引了两个我试图用外键引用的列,我就能够成功地使用alter表并创建外键关系。您将看到列的索引如下面的屏幕截图所示:
注意两个表中都显示了邮政编码。
ve7v8dk218#
我使用的是heidisql,为了解决这个问题,我必须在引用的表中创建一个索引,引用所有列。
webghufk19#
我和heidisql遇到了同样的问题。你收到的错误很神秘。我的问题是外键列和引用列的类型或长度不同。
外键列无效
SMALLINT(5) UNSIGNED
引用的列是INT(10) UNSIGNED
. 一旦我把它们都做成了相同的类型,外键的创建就完美地工作了。c9x0cxw020#
我也有同样的问题。
问题是引用列不是主键。
把它作为主键,问题就解决了。
qltillow21#
显示此错误的另一个可能原因。我创建表的顺序是错误的。我试图从一个尚未创建的表中引用一个键。
xyhw6mcr22#
我有同样的问题,两列都是int(11)not null,但是我不能创建外键。我必须禁用外键检查才能成功运行:
希望这对别人有帮助。
yduiuuwa23#
只是为了完成。
如果外键带有varchar(..),并且引用表的字符集与引用它的表的字符集不同,则也可能出现此错误。
e、 g.拉丁1表中的varchar(50)与utf8表中的varchar(50)不同。
fnx2tebb24#
(last resent)即使字段名和数据类型相同但排序规则不同,也会导致该问题。
例如
tbl名称 | 数据类型 | 校勘
活动ID | 内景 | 拉丁语 活动ID | 内景 | utf8\通用\ ci
试着把它改成
tbl名称 | 数据类型 | 校勘
活动ID | 内景 | 拉丁语 活动ID | 内景 | 拉丁语
....
这对我有用。
r9f1avp525#
感谢s doerin:
“只是为了完成。如果外键带有varchar(..),并且引用表的字符集与引用它的表的字符集不同,则也可能出现此错误。e、 g.拉丁1表中的varchar(50)与utf8表中的varchar(50)不同。”
我解决了这个问题,改变了表的字符类型。创建的是拉丁文1,正确的是utf8。
添加下一行。默认字符集=utf8;
pw136qt226#
我对symfony2.8也有同样的问题。
一开始我没有明白,因为外键的int长度等方面没有类似的问题。
最后,我不得不在项目文件夹中执行以下操作(服务器重启没有帮助!)
app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result
kxe2p93d27#
我的情况是,我提到的专栏有一个拼写错误:
这个错误消息非常神秘,我已经尝试了所有的方法——验证列的类型、排序规则、引擎等等。
我花了一段时间才注意到拼写错误,在修复之后,一切都很顺利:
sczxawaw28#
虽然其他的答案很有帮助,但我也想分享一下我的经验。
当我删除了一个
id
已在其他表(包含数据)中作为外键引用,并尝试重新创建/导入包含其他列的表。娱乐查询(在phpmyadmin中生成)如下所示:
你可能注意到
PRIMARY KEY
索引是在创建(和插入数据)之后设置的,这是导致问题的原因。解决方案
解决方法是添加
PRIMARY KEY
表定义查询的索引id
它被引用为外键,同时也从ALTER TABLE
设置索引的部分:v09wglhw29#
我刚才碰到了同样的问题。在我的例子中,我所要做的就是确保我在外键中引用的表必须在当前表之前创建(在代码前面)。因此,如果您引用一个变量(x*5),系统应该知道x是什么(x必须在前面的代码行中声明)。这解决了我的问题,希望能帮助别人。
7nbnzgx930#
您需要检查两者的所有属性是否相同,包括“排序规则”