Mysql 外键冲突。需要在中间级别阻止删除-但在从顶级父级启动时允许删除

Mysql 外键冲突。需要在中间级别阻止删除-但在从顶级父级启动时允许删除,mysql,Mysql,在下面的(人工的)例子中,我有一个部门有产品,每个产品可以有一个或多个“库存”行(例如库存)。我有一个外键设置,它可以防止在有子库存行时删除产品,而且效果很好。然而,我遇到了需要删除部门行的情况——当这种情况发生时,我希望所有子行(产品和库存)级联并删除。在mysql中有可能做到这一点吗?我有种感觉,这是不可能的两种方式-保护在一个中等水平-但删除时,启动从顶部的父母 尝试删除部门时出现以下错误 错误代码:1451。无法删除或更新父行:外键约束失败(wbxstock,约束fk\u stock\u

在下面的(人工的)例子中,我有一个部门有产品,每个产品可以有一个或多个“库存”行(例如库存)。我有一个外键设置,它可以防止在有子库存行时删除产品,而且效果很好。然而,我遇到了需要删除部门行的情况——当这种情况发生时,我希望所有子行(产品和库存)级联并删除。在mysql中有可能做到这一点吗?我有种感觉,这是不可能的两种方式-保护在一个中等水平-但删除时,启动从顶部的父母

尝试删除部门时出现以下错误

错误代码:1451。无法删除或更新父行:外键约束失败(
wbx
stock
,约束
fk\u stock\u product
外键(
product\u id
)引用
product
id
)删除时更新时无操作无操作)


您的产品是否与部门共享一种关系?请添加包含示例数据的INSERT语句以及失败的查询。已添加INSERT语句。无法删除正确的产品#1,因为有一个与之关联的库存行。但是你也不能删除部门1,我需要这样做。仅供参考-现实场景是一款拥有众多客户的应用程序。每个顾客都有许多桌子在下面。但当客户决定不再使用该应用程序时,我需要删除该客户和所有相关数据。如果有必要,我可以从底部开始删除,直到外键问题消失——但最好是删除客户行并将所有内容向下级联。有趣的问题。我不知道怎么解决它。但要求也有点奇怪。这就像禁止锯掉树枝,因为树枝上有叶子。但可以将整棵树砍掉:-)可能的重复您的产品是否与部门共享一个关系?请添加包含示例数据的INSERT语句,并添加失败的查询。已添加INSERT语句。无法删除正确的产品#1,因为有一个与之关联的库存行。但是你也不能删除部门1,我需要这样做。仅供参考-现实场景是一款拥有众多客户的应用程序。每个顾客都有许多桌子在下面。但当客户决定不再使用该应用程序时,我需要删除该客户和所有相关数据。如果有必要,我可以从底部开始删除,直到外键问题消失——但最好是删除客户行并将所有内容向下级联。有趣的问题。我不知道怎么解决它。但要求也有点奇怪。这就像禁止锯掉树枝,因为树枝上有叶子。但是倒整棵树也没关系:-)可能是

CREATE TABLE IF NOT EXISTS `dept` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS `product` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `dept_id` INT UNSIGNED NOT NULL,
  `description` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_product_dept_idx` (`dept_id` ASC),
  CONSTRAINT `fk_product_dept`
    FOREIGN KEY (`dept_id`)
    REFERENCES `dept` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS `stock` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `dept_id` INT UNSIGNED NOT NULL,
  `product_id` INT UNSIGNED NOT NULL,
  `qty` DECIMAL(5) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  INDEX `fk_stock_dept_idx` (`dept_id` ASC),
  INDEX `fk_stock_product_idx` (`product_id` ASC),
  CONSTRAINT `fk_stock_dept`
    FOREIGN KEY (`dept_id`)
    REFERENCES `dept` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_stock_product`
    FOREIGN KEY (`product_id`)
    REFERENCES `product` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

USE `wbx` ;

INSERT INTO `wbx`.`dept` (`id`, `name`) VALUES ('1', 'Sales');

INSERT INTO `wbx`.`product` (`id`, `dept_id`, `description`) VALUES ('1', '1', 'Boots');

INSERT INTO `wbx`.`stock` (`id`, `dept_id`, `product_id`, `qty`) VALUES ('1', '1', '1', '5');

delete from dept where id=1'