mysql外键约束格式错误

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

我有两张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新手

bttbmeg0

bttbmeg01#

检查您是否以正确的大小写指定了表名(如果数据库中的表名区分大小写)。在我的情况下,我必须改变

CONSTRAINT `FK_PURCHASE_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON UPDATE CASCADE ON DELETE CASCADE

CONSTRAINT `FK_PURCHASE_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `CUSTOMER` (`id`) ON UPDATE CASCADE ON DELETE CASCADE

注意 customer 更改为 CUSTOMER .

lc8prwob

lc8prwob2#

我面临这个问题当您将主键放在不同的数据类型中时出现错误,例如:
表1:

Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('product_name');
        });

表2:

Schema::create('brands', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('brand_name');
        });

第二个表的id的数据类型必须是增量

ffvjumwh

ffvjumwh3#

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

sshcrbum

sshcrbum4#

当使用创建父表时,我遇到了相同的问题 MyISAM 引擎。这是个愚蠢的错误,我纠正了:

ALTER TABLE parent_table ENGINE=InnoDB;
aamkag61

aamkag615#

虽然其他的答案很有帮助,但我也想分享一下我的经验。
当我删除了一个 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;
q8l4jmvw

q8l4jmvw6#

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

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

希望这对别人有帮助。

r9f1avp5

r9f1avp57#

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

pepwfjgg

pepwfjgg8#

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

kdfy810k

kdfy810k9#

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

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
nsc4cvqm

nsc4cvqm10#

或者可以使用dbdesigner4,它有一个图形界面来创建数据库并使用fk链接它们。右键单击表并选择“copy table sql create”创建代码。

gab6jxml

gab6jxml11#

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

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

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

qvk1mo1f

qvk1mo1f12#

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

qvk1mo1f

qvk1mo1f13#

定义外键的语法是非常宽容的,但是对于任何一个在这个问题上犯错误的人来说,外键必须是“同一类型”这一事实甚至适用于排序规则,而不仅仅是数据类型、长度和位签名。
不是说你会在你的模型中混合排序规则(你会吗?),而是如果你这样做了,确保你的主键和外键字段在phpmyadmin或HeidiSQL或你使用的任何东西中是相同的排序规则类型。
希望这能节省你四个小时的试验和错误,它花费了我。

bwleehnv

bwleehnv14#

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

rseugnpd

rseugnpd15#

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

相关问题