我有两个表,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的新手


当前回答

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

只要确保列'ID'在'table1'有唯一的索引!

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

其他回答

试着运行以下命令:

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;

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

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

只是为了完成。

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

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

我在Laravel 5.1迁移Schema Builder到MariaDB 10.1时也遇到了同样的问题。

问题是我在设置列时输入了unsigned而不是unsigned(s字母不见了)。

修复后,错别字为我修复。

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