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


当前回答

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

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

希望这能帮助到一些人。

其他回答

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

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

to

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

注意客户变更为客户。

对于任何面临这个问题的人,跑吧 显示引擎innodb状态 详细信息请参见LATEST外键错误部分。

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

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

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

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

例如

资源描述 name | data 类型           | 排序 ActivityID           |         INT                         | latin1_general_ci ActivityID           |         INT                         | utf8_general_ci

试着把它变成

资源描述 name | data 类型           | 排序 ActivityID           |         INT                         | latin1_general_ci ActivityID           |         INT                         | latin1_general_ci

....

这对我很管用。

虽然其他的答案都很有帮助,但我也想分享一下我的经验。

当我删除了一个表,它的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索引是在创建(和插入数据)之后设置的,这导致了问题。

解决方案

解决方案是在表定义查询中为被引用为外键的id添加PRIMARY KEY索引,同时从设置索引的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;