4
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_idparentFOREIGN KEY ( idparent) REFERENCES categories( idcategories) ON DELETE CASCADE ON UPDATE CASCADE) SQL 语句:UPDATE categoriesSET idcategories=10 WHERE idcategories='1'

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

错误在哪里?比你。

4

2 回答 2

7

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

偏离 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

于 2012-04-25T17:42:50.613 回答
0

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

SET FOREIGN_KEY_CHECKS=0;

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

SET FOREIGN_KEY_CHECKS=1;
于 2021-04-22T11:53:01.430 回答