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

我试图在这里寻找答案,但我所找到的一切都表明,要么将数据库引擎设置为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 RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)

我经历这个错误的原因完全不同。我使用MySQL Workbench 6.3创建我的数据模型(很棒的工具)。我注意到,当外键约束定义中定义的列顺序不符合表列顺序时,也会生成此错误。

我花了大约4个小时的时间尝试了所有其他方法,就是没能确认。

现在一切正常,我可以继续编码了。:-)

在使用Laravel 4时,特别是使用JeffreyWay的Laravel 4生成器时,我遇到了一个“错误1215:不能添加外键约束”的陷阱。

在Laravel 4中,您可以使用JeffreyWay的Generators生成迁移文件,逐个创建表,这意味着每个迁移文件生成一个表。

您必须意识到这样一个事实,即每个迁移文件在文件名中都有一个时间戳,它给出了文件的顺序。生成的顺序也是当你触发Artisan CLI命令php Artisan migrate时迁移操作的顺序。

因此,如果一个文件请求一个指向后一个文件中将生成但尚未生成的键的外键约束,Error 1215将被触发。

在这种情况下,您需要调整迁移文件生成的顺序。按正确顺序生成新文件,复制内容,然后删除无序的旧文件。

检查表格的排列顺序。使用SHOW TABLE STATUS,可以检查表的信息,包括排序规则。

两个表必须具有相同的排序规则。

这种事发生在我身上。

检查表的兼容性(引擎)与SHOW table STATUS WHERE Name = 'tableName'。

例如,如果一个表是MyISAM,另一个表是InnoDB,你可能会遇到这个问题。

你可以通过下面的命令来改变它:

ALTER TABLE myTable ENGINE = InnoDB;

从文档。