错误1451:无法删除或更新父行:外键约束失败

时间:2012-04-25 17:32:37

标签: sql cascade mysql-error-1451

CREATE  TABLE `categories` (
  `idcategories` INT NOT NULL AUTO_INCREMENT ,
  `idparent` INT NULL ,
  `description` VARCHAR(45) NULL ,
  PRIMARY KEY (`idcategories`) );

ALTER TABLE `categories` 
  ADD CONSTRAINT `FK_idparent`
  FOREIGN KEY (`idparent` )
  REFERENCES `ilmercatinodelpulcino`.`categories` (`idcategories` )
  ON DELETE CASCADE
  ON UPDATE CASCADE
, ADD INDEX `FK_idparent` (`idparent` ASC) ;

INSERT INTO `categories` (`idcategories`, `description`)
    VALUES (1, 'cat1');
INSERT INTO `categories` (`idcategories`, `idparent`, `description`)
    VALUES (2, 1, 'cat1_child');

因此,此表表示一个类别,具有ID和自我指向的父ID。 我插入了一个类别cat1和一个子类别cat1_child,其父ID为cat1。

现在,我希望能够将cat1的idcategory从1更改为10,因为我在更新CASCADE上设置了外键,我希望cat1_child的idparent也将设置为10。 但是当我这样做时:

UPDATE `categories` SET `idcategories`=10 WHERE `idcategories`='1';

我收到错误:

  

错误1451:无法删除或更新父行:外键   约束失败(categories,CONSTRAINT FK_idparent FOREIGN KEY   (idparent)REFERENCES categoriesidcategories)ON DELETE   CASCADE ON UPDATE CASCADE)SQL语句:更新categories SET   idcategories = 10 WHERE idcategories =' 1'

删除工作按预期工作,删除cat1,cat1_child也将被删除。

错误在哪里? 比你。

2 个答案:

答案 0 :(得分:7)

我相信答案在documentation(向下滚动到底部):

  

偏离SQL标准:如果ON UPDATE CASCADEON UPDATE SET NULL递归更新同一个表,则先前已更新   在级联期间,它的行为类似于RESTRICT。这意味着你不能   使用自引用ON UPDATE CASCADEON UPDATE SET NULL   操作。这是为了防止级联产生的无限循环   更新。另一方面,自我指涉ON DELETE SET NULL是   可能,就像自我指涉ON DELETE CASCADE一样。级联   操作可能不会嵌套超过15级。

演示:http://www.sqlfiddle.com/#!2/e29db/1

答案 1 :(得分:0)

我遇到了同样的问题,然后我使用下面的查询禁用了外键检查,然后我能够删除该行

SET FOREIGN_KEY_CHECKS=0;

您还可以使用以下查询启用外键检查

SET FOREIGN_KEY_CHECKS=1;