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

Sim*_*nti 4 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');
Run Code Online (Sandbox Code Playgroud)

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

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

UPDATE `categories` SET `idcategories`=10 WHERE `idcategories`='1';
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

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

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

错误在哪里?比你.

mel*_*okb 7

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

与SQL标准的偏差:如果ON UPDATE CASCADE或者ON UPDATE SET NULLrecurses更新它在级联期间先前已更新的同一个表,它的作用就像RESTRICT.这意味着您不能使用自引用ON UPDATE CASCADEON UPDATE SET NULL 操作.这是为了防止级联更新导致的无限循环.自引用的ON DELETE SET NULL,在另一方面,是可能的,因为是自引用ON DELETE CASCADE.级联操作可能不会嵌套超过15级.

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