我有两个表,table1是一个列ID的父表,table2是一个列IDFromTable1(不是实际的名称),当我把一个FK IDFromTable1到ID在table1,我得到的错误外键约束是不正确形成的错误。我想删除表2记录,如果表1记录被删除。谢谢你的帮助

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

如果还需要其他信息,请告诉我。我是mysql的新手


当前回答

只是为了完成。

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

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

其他回答

试着运行以下命令:

show create table Parent

//and check if type for both tables are the same, like myISAM or innoDB, etc
//Other aspects to check with this error message: the columns used as foreign 
keys must be indexed, they must be of the same type 
(if i.e one is of type smallint(5) and the other of type smallint(6), 
it won't work), and, if they are integers, they should be unsigned.

//or check for charsets
show variables like "character_set_database";
show variables like "collation_database";

//edited: try something like this
ALTER TABLE table2
ADD CONSTRAINT fk_IdTable2
FOREIGN KEY (Table1_Id)
REFERENCES Table1(Table1_Id)
ON UPDATE CASCADE 
ON DELETE CASCADE;

在Laravel中,当您在引用table2的迁移之后又迁移了外键table table1时,也会出现这个问题。

您必须保留迁移的顺序,以便外键特性能够正常工作。

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

我面临这个问题,当你把主键放在不同的数据类型,比如:

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

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

外键列是SMALLINT(5) UNSIGNED,引用列是INT(10) UNSIGNED。一旦我将它们都设置为完全相同的类型,外键的创建就会完美地工作。

如果一切正常,只需添加->unsigned();在外键的末尾。

如果不行,请检查两个字段的数据类型。它们必须是一样的。