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
,CONSTRAINTFK_idparent
FOREIGN KEY (idparent
)REFERENCEScategories
(idcategories
)ON DELETE CASCADE ON UPDATE CASCADE)SQL语句:更新categories
SETidcategories
= 10 WHEREidcategories
=' 1'
删除工作按预期工作,删除cat1,cat1_child也将被删除。
错误在哪里? 比你。
答案 0 :(得分:7)
我相信答案在documentation(向下滚动到底部):
偏离SQL标准:如果
ON UPDATE CASCADE
或ON UPDATE SET NULL
递归更新同一个表,则先前已更新 在级联期间,它的行为类似于RESTRICT
。这意味着你不能 使用自引用ON UPDATE CASCADE
或ON UPDATE SET NULL
操作。这是为了防止级联产生的无限循环 更新。另一方面,自我指涉ON DELETE SET NULL
是 可能,就像自我指涉ON DELETE CASCADE
一样。级联 操作可能不会嵌套超过15级。
答案 1 :(得分:0)
我遇到了同样的问题,然后我使用下面的查询禁用了外键检查,然后我能够删除该行
SET FOREIGN_KEY_CHECKS=0;
您还可以使用以下查询启用外键检查
SET FOREIGN_KEY_CHECKS=1;