我试图将我的新模式转发到我的数据库服务器上,但我不知道为什么我会得到这个错误。

我试图在这里寻找答案,但我所找到的一切都表明,要么将数据库引擎设置为InnoDB,要么确保我试图用作外键的键是它们自己表中的主键。如果我没记错的话,这两件事我都做过。我还能做什么?

Executing SQL script in server

ERROR: Error 1215: Cannot add foreign key constraint

-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

SQL脚本执行完成:语句:7成功,1失败

下面是父表的SQL。

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB

当前回答

对我来说,1215错误发生在我导入mysqldump创建的dumpfile时,它按字母顺序创建了表,在我的例子中,这导致外键引用文件中稍后创建的表。(这篇博客文章指出:MySQL错误代码1215:“不能添加外键约束”)

由于mysqldump订单表字母顺序和我不想改变表的名字,我遵循的答案由JeremyWeir在本页上的说明,这说明要把设置FOREIGN_KEY_CHECKS = 0;把SET FOREIGN_KEY_CHECKS = 1;在转储文件的底部。

这个方法对我很有效。

其他回答

我也遇到过同样的问题,我的解决方案是:

之前:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

解决方案:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

当这个错误发生时,因为引用的表使用了MyISAM引擎,这个答案提供了一个快速转换数据库的方法,让所有的Django模型表都使用InnoDB:用Django将一个现有的MyISAM数据库转换为InnoDB

这是一个叫做convert_to_innodb的Django管理命令。

你也可以检查两个表的Engine设置为InnoDB。

此错误的另一个来源是当您有两个或多个具有相同外键名的相同表名时。

这种情况有时会发生在使用建模和设计软件(如MySQL Workbench),然后从设计中生成脚本的人身上。

我也有同样的问题。

我是这样解决的:

中创建了以下行 主键:(id int(11) unsigned NOT NULL AUTO_INCREMENT)

在尝试在我的模式构建器中导入一个表之后,我找到了这个解决方案。