240

我有两个表,当我将 FK 放在其中时table1,父表有一个列IDtable2一个列IDFromTable1(不是实际名称),我得到了错误。如果记录被删除,我想删除表 2 记录。谢谢你的帮助IDFromTable1IDtable1Foreign key constraint is incorrectly formed errortable1

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

让我知道是否需要任何其他信息。我是 mysql 新手

4

36 回答 36

557

我在使用 HeidiSQL 时遇到了同样的问题。您收到的错误非常神秘。我的问题最终是外键列和引用列的类型或长度不同。

外键列是SMALLINT(5) UNSIGNED,引用列是INT(10) UNSIGNED。一旦我使它们都具有相同的确切类型,外键创建就可以完美地工作。

于 2012-06-19T01:15:32.980 回答
68

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

ALTER TABLE parent_table ENGINE=InnoDB;
于 2015-12-14T18:37:46.793 回答
56

对于遇到此问题的任何人,只需运行 SHOW ENGINE INNODB STATUS 并查看LATEST FOREIGN KEY ERROR部分了解详细信息。

于 2020-10-07T20:12:36.190 回答
40

确保列相同(相同类型),如果参考列不是primary_key,请确保它是INDEXED

于 2016-06-09T08:19:31.843 回答
24

定义外键的语法是非常宽容的,但是对于任何其他人来说,外键必须是“相同类型”的事实甚至适用于排序规则,而不仅仅是数据类型和长度以及位签名。

并不是说您会在模型中混合排序规则(会吗?),但如果这样做,请确保您的主键字段和外键字段在 phpmyadmin 或 Heidi SQL 或您使用的任何内容中具有相同的排序规则类型。

希望这可以节省您花费我四个小时的反复试验。

于 2013-04-18T21:56:16.113 回答
18

mysql错误文本没有太大帮助,在我的情况下,列有“ not null”约束,所以“ on delete set null”是不允许的

于 2016-08-26T08:20:19.947 回答
17

我有同样的问题,但解决了。

只需确保“table1”中的“ID”列具有唯一索引!

当然,这两个表中“ID”和“IDFromTable1”列的类型和长度必须相同。但是你已经知道了。

于 2016-09-01T19:20:19.230 回答
12

只为完成。

如果您有一个带有 VARCHAR(..) 的外键并且被引用表的字符集与引用它的表不同,则可能会出现此错误。

例如,Latin1 表中的 VARCHAR(50) 与 UTF8 表中的 VARCHAR(50) 不同。

于 2016-02-18T14:43:44.380 回答
11

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

于 2018-03-07T07:27:10.690 回答
10

如果一切正常,只需->unsigned();在末尾添加foregin key.

如果它不起作用,请检查两个字段的数据类型。它们必须相同。

于 2016-06-01T10:37:51.723 回答
9

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

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

希望这可以帮助某人。

于 2018-02-05T16:02:21.437 回答
7

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

例如

    TBL 名称 | 数据类型 | 整理        

    活动ID | 情报 |         latin1_general_ci     ActivityID | 情报 |         utf8_general_ci

尝试将其更改为

    TBL 名称 | 数据类型 | 整理        

    活动ID | 情报 |         latin1_general_ci     ActivityID | 情报 |         latin1_general_ci

……

这对我有用。

于 2018-05-01T09:47:51.447 回答
5

检查表引擎,两个表必须是相同的引擎,这对我帮助很大。

于 2017-09-13T12:14:47.257 回答
5

当您在引用它的迁移之后进行Laravel外键表迁移时,也会出现此问题。table1table2

您必须保留迁移的顺序才能使foreign key功能正常工作。

database/migrations/2020_01_01_00001_create_table2_table.php
database/migrations/2020_01_01_00002_create_table1_table.php

应该:

database/migrations/2020_01_01_00001_create_table1_table.php
database/migrations/2020_01_01_00002_create_table2_table.php
于 2020-07-05T15:45:02.330 回答
4

尽管其他答案很有帮助,但也只是想分享我的经验。

当我删除了一个已经在其他表(带有数据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;
于 2017-08-23T13:04:13.487 回答
3

尝试运行以下:

显示创建表父

//并检查两个表的类型是否相同,例如myISAM或innoDB等
//要检查此错误消息的其他方面:用作外部的列
键必须被索引,它们必须是相同的类型
(如果一个是 smallint(5) 类型,另一个是 smallint(6) 类型,
它不起作用),并且,如果它们是整数,它们应该是无符号的。

//或检查字符集
显示像“character_set_database”这样的变量;
显示变量,如“collat​​ion_database”;

//已编辑:尝试这样的事情
更改表表 2
添加约束 fk_IdTable2
外键(Table1_Id)
参考表 1(表 1_Id)
更新级联
删除级联;
于 2011-12-08T16:58:43.747 回答
3

我为此输了几个小时!

一桌PK在另一utf8utf8_unicode_ci

于 2018-01-23T15:34:08.727 回答
2

我有同样的问题。

问题是引用列不是主键。

使其成为主键,问题就解决了。

于 2016-10-18T11:01:55.043 回答
2

谢谢S Doerin:

“只是为了完成。如果您有一个带有 VARCHAR(..) 的外键并且被引用表的字符集与引用它的表不同,则此错误也可能是这种情况。例如 Latin1 表中的 VARCHAR(50) 是不同于 UTF8 表中的 VARCHAR(50)。”

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

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

于 2016-10-24T04:56:09.733 回答
2

我遇到了这个问题,当您将主键放入不同的数据类型时出现错误,例如:

表格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 的数据类型必须是增量

于 2020-03-03T19:50:32.963 回答
2

对于任何像我一样在这个问题上苦苦挣扎的人,这是我的问题:

我试图更改表以将字段从 VARCHAR(16) 更改为 VARCHAR(255),这引用了另一个数据类型仍为 VARCHAR(16) 的表列...

于 2021-10-20T14:44:30.940 回答
1

我对 Symfony 2.8 也有同样的问题。

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

最后我必须在项目文件夹中执行以下操作。(服务器重启没有帮助!)

app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result

于 2016-05-24T14:07:56.517 回答
1

我在使用 Alter table 在两个表之间添加外键时遇到了问题,帮助我确保我尝试添加外键关系的每一列都被索引。在 PHP myAdmin 中执行此操作: 转到表并单击结构选项卡。单击索引选项以索引所需的列,如屏幕截图所示:

在此处输入图像描述

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

在此处输入图像描述

注意 zip_code 在两个表中的显示方式。

于 2017-01-12T22:40:49.197 回答
1

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

于 2017-08-03T16:13:48.163 回答
1

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

向表 Heidisql 添加索引

于 2017-10-09T15:57:08.610 回答
1

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

于 2019-07-15T00:39:06.803 回答
1

我的情况是我在引用的列上有错字:

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
于 2020-02-23T18:47:54.803 回答
0

我在使用 MariaDB 10.1 的 Laravel 5.1 迁移架构生成器时遇到了同样的问题。

问题是我在设置列时键入unigned而不是unsigned(缺少字母)。s

修复拼写错误后,我已修复。

于 2015-12-01T16:58:25.230 回答
0

即使我遇到了与 mysql 和 liquibase 相同的问题。所以这就是问题所在:您要从中引用其他表的列的表在数据类型或数据类型大小方面是不同的。

Error appears in below scenario:
Scenario 1:
Table A has column id, type=bigint
Table B column referenced_id type varchar(this column gets the value from the id column of Table A.)
Liquibase changeset for table B:

    <changeset id="XXXXXXXXXXX-1" author="xyz">
            <column name="referenced_id" **type="varchar"**>
        </column>
            </changeset>
    <changeSet id="XXXXXXXXXXX-2" author="xyz">
                <addForeignKeyConstraint constraintName="FK_table_A"
                    referencedTableName="A" **baseColumnNames="referenced_id**"
                    referencedColumnNames="id" baseTableName="B" />
    </changeSet>

Table A changeSet:

    <changeSet id="YYYYYYYYYY" author="xyz">
     <column **name="id"** **type="bigint"** autoIncrement="${autoIncrement}">
                    <constraints primaryKey="true" nullable="false"/>
                </column>
    </changeSet>

Solution: 
correct the type of table B to bigint because the referenced table has type bigint.

Scenrario 2:
The type might be correct but the size might not.
e.g. :
Table B : referenced column type="varchar 50"
Table A : base column type ="varchar 255"

Solution change the size of referenced column to that of base table's column size.
于 2017-11-15T06:26:28.723 回答
0

检查您是否以正确的大小写指定了表名(如果数据库中的表名区分大小写)。就我而言,我不得不改变

 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.

于 2018-02-19T13:17:14.817 回答
0

或者您可以使用具有图形界面的 DBDesigner4 来创建您的数据库并使用 FK 链接它们。右键单击您的表并选择创建代码的“复制表 SQL 创建”。

在此处输入图像描述

于 2018-04-07T04:33:58.470 回答
0

这是一个古老的主题,但我发现了一些东西。在构建 MySQL 工作台的同时,它还获取了另一个表的关系。只留下与您相关的支柱。清除其他自动添加的列。这对我有用。

于 2020-01-27T11:37:07.940 回答
0

问题很简单解决

例如:您有两个名称为用户帖子的表,并且您想在帖子表中创建外键并使用phpMyAdmin

1)在post表中添加新列名称:use_id |类型:类似于用户表中的id |长度:类似于用户表中的id |默认值:NULL |属性:无符号 | 索引:索引)

2)在结构选项卡上转到关系视图约束名称:由 phpmyAdmin 自动设置 |列名:选择 user_id |:用户 |:id ,...)

简单解决了

javad mosavi 伊朗/乌尔米亚

于 2020-03-31T12:42:37.270 回答
0

我遇到了同样的错误,我发现在我自己的情况下,一张桌子是 MyISAM,另一张是 INNO。一旦我将 MyISAM 表切换到 INNO。它解决了这个问题。

于 2021-06-30T09:19:42.583 回答
0

我在这里缺少的另一个解决方案是,被引用表的每个主键都应该在创建约束的表中具有一个带有外键的条目。

于 2021-07-16T20:11:57.177 回答
-1

如果 U 表是Myisum并且新表是InoDb你是注 你必须将 MyIsum表更改为 InoDb

于 2022-02-01T07:54:31.627 回答