我有两个表,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;

希望这能帮助到一些人。

其他回答

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

当我删除了一个表,它的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;

我在Symfony 2.8上也遇到了同样的问题。

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

最后,我必须在项目文件夹中执行以下操作。(服务器重启不起作用!)

应用程序/控制台学说:缓存:clear-metadata 应用程序/控制台学说:缓存:clear-query 应用程序/控制台学说:缓存:明确的结果

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

如果你的表是Myisum,新表是InoDb,你是Note Foreign 您必须将MyIsum表更改为InoDb

只是为了完成。

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

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