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