mysql外键约束格式错误

mbyulnm0  于 2021-06-17  发布在  Mysql
关注(0)|答案(30)|浏览(383)

我有两张table, table1 是具有列的父表 ID 以及 table2 有一列 IDFromTable1 (不是真实的名字)当我放上一个fk的时候 IDFromTable1IDtable1 我得到了错误 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新手

ac1kyiln

ac1kyiln16#

我对laravel5.1迁移模式生成器和mariadb10.1有同样的问题。
问题是我打字了 unigned 而不是 unsigned (the) s 设置列时丢失了字母)。
在修正了排版错误之后,我就修正了。

guykilcj

guykilcj17#

我在使用altertable在两个表之间添加外键时遇到了一些问题,帮助我的是确保要添加外键关系的每一列都被编入索引。在phpmyadmin中这样做:转到表并单击structure选项卡。单击索引选项为所需列编制索引,如屏幕截图所示:

一旦我索引了两个我试图用外键引用的列,我就能够成功地使用alter表并创建外键关系。您将看到列的索引如下面的屏幕截图所示:

注意两个表中都显示了邮政编码。

ve7v8dk2

ve7v8dk218#

我使用的是heidisql,为了解决这个问题,我必须在引用的表中创建一个索引,引用所有列。

webghufk

webghufk19#

我和heidisql遇到了同样的问题。你收到的错误很神秘。我的问题是外键列和引用列的类型或长度不同。
外键列无效 SMALLINT(5) UNSIGNED 引用的列是 INT(10) UNSIGNED . 一旦我把它们都做成了相同的类型,外键的创建就完美地工作了。

c9x0cxw0

c9x0cxw020#

我也有同样的问题。
问题是引用列不是主键。
把它作为主键,问题就解决了。

qltillow

qltillow21#

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

xyhw6mcr

xyhw6mcr22#

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

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

希望这对别人有帮助。

yduiuuwa

yduiuuwa23#

只是为了完成。
如果外键带有varchar(..),并且引用表的字符集与引用它的表的字符集不同,则也可能出现此错误。
e、 g.拉丁1表中的varchar(50)与utf8表中的varchar(50)不同。

fnx2tebb

fnx2tebb24#

(last resent)即使字段名和数据类型相同但排序规则不同,也会导致该问题。
例如
    tbl名称       |        数据类型          |         校勘        
    活动ID          |        内景                        |         拉丁语    活动ID          |        内景                        |         utf8\通用\ ci
试着把它改成
    tbl名称       |        数据类型          |         校勘        
    活动ID          |        内景                        |         拉丁语    活动ID          |        内景                        |         拉丁语
....
这对我有用。

r9f1avp5

r9f1avp525#

感谢s doerin:
“只是为了完成。如果外键带有varchar(..),并且引用表的字符集与引用它的表的字符集不同,则也可能出现此错误。e、 g.拉丁1表中的varchar(50)与utf8表中的varchar(50)不同。”
我解决了这个问题,改变了表的字符类型。创建的是拉丁文1,正确的是utf8。
添加下一行。默认字符集=utf8;

pw136qt2

pw136qt226#

我对symfony2.8也有同样的问题。
一开始我没有明白,因为外键的int长度等方面没有类似的问题。
最后,我不得不在项目文件夹中执行以下操作(服务器重启没有帮助!) app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result

kxe2p93d

kxe2p93d27#

我的情况是,我提到的专栏有一个拼写错误:

MariaDB [blog]> alter table t_user add FOREIGN KEY ( country_code ) REFERENCES t_country ( coutry_code );
ERROR 1005 (HY000): Can't create table `blog`.`t_user` (errno: 150 "Foreign key constraint is incorrectly formed")

这个错误消息非常神秘,我已经尝试了所有的方法——验证列的类型、排序规则、引擎等等。
我花了一段时间才注意到拼写错误,在修复之后,一切都很顺利:

MariaDB [blog]> alter table t_user add FOREIGN KEY ( country_code ) REFERENCES t_country ( country_code );
Query OK, 2 rows affected (0.039 sec)              
Records: 2  Duplicates: 0  Warnings: 0
sczxawaw

sczxawaw28#

虽然其他的答案很有帮助,但我也想分享一下我的经验。
当我删除了一个 id 已在其他表(包含数据)中作为外键引用,并尝试重新创建/导入包含其他列的表。
娱乐查询(在phpmyadmin中生成)如下所示:

CREATE TABLE `the_table` (
  `id` int(11) NOT NULL,            /* No PRIMARY KEY index */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

... /* SOME DATA DUMP OPERATION */

ALTER TABLE `the_table`
  ADD PRIMARY KEY (`id`), /* PRIMARY KEY INDEX */
  ADD UNIQUE KEY `uk_acu_donor_name` (`name`);

你可能注意到 PRIMARY KEY 索引是在创建(和插入数据)之后设置的,这是导致问题的原因。

解决方案

解决方法是添加 PRIMARY KEY 表定义查询的索引 id 它被引用为外键,同时也从 ALTER TABLE 设置索引的部分:

CREATE TABLE `the_table` (
  `id` int(11) NOT NULL PRIMARY KEY,            /* <<== PRIMARY KEY INDEX ON CREATION */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
v09wglhw

v09wglhw29#

我刚才碰到了同样的问题。在我的例子中,我所要做的就是确保我在外键中引用的表必须在当前表之前创建(在代码前面)。因此,如果您引用一个变量(x*5),系统应该知道x是什么(x必须在前面的代码行中声明)。这解决了我的问题,希望能帮助别人。

7nbnzgx9

7nbnzgx930#

您需要检查两者的所有属性是否相同,包括“排序规则”

相关问题