【问题标题】:ERROR 1451: Cannot delete or update a parent row: a foreign key constraint failsERROR 1451:无法删除或更新父行:外键约束失败
【发布时间】:2012-04-25 17:32:36
【问题描述】:
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) 参考文献categories (idcategories) 删除 CASCADE ON UPDATE CASCADE) SQL 语句:UPDATE categories SET idcategories=10 其中idcategories='1'

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

错误在哪里? 比你。

【问题讨论】:

标签: sql cascade mysql-error-1451


【解决方案1】:

我相信答案在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

【讨论】:

  • 谢谢。有什么办法可以做我想做的事吗?
【解决方案2】:

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

SET FOREIGN_KEY_CHECKS=0;

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

SET FOREIGN_KEY_CHECKS=1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-21
    • 2018-08-13
    • 1970-01-01
    • 2022-09-23
    • 2020-08-10
    • 2017-07-20
    • 2017-06-11
    相关资源
    最近更新 更多