gpt4 book ai didi

mysql - 以什么顺序处理 ON DELETE CASCADE 约束?

转载 作者:IT王子 更新时间:2023-10-28 23:49:24 26 4
gpt4 key购买 nike

这是我正在做的一个例子:

CREATE TABLE Parent (id BIGINT NOT NULL,
PRIMARY KEY (id)) ENGINE=InnoDB;

CREATE TABLE Child (id BIGINT NOT NULL,
parentid BIGINT NOT NULL,
PRIMARY KEY (id),
KEY (parentid),
CONSTRAINT fk_parent FOREIGN KEY (parentid) REFERENCES Parent (id) ON DELETE CASCADE) ENGINE=InnoDB;

CREATE TABLE Uncle (id BIGINT NOT NULL,
parentid BIGINT NOT NULL,
childid BIGINT NOT NULL,
PRIMARY KEY (id),
KEY (parentid),
KEY (childid),
CONSTRAINT fk_parent_u FOREIGN KEY (parentid) REFERENCES Parent (id) ON DELETE CASCADE,
CONSTRAINT fk_child FOREIGN KEY (childid) REFERENCES Child (id)) ENGINE=InnoDB;

注意叔- child 关系没有ON DELETE CASCADE;即删除 Child 不会删除其 Uncle,反之亦然。

当我有一个 parent 和一个叔叔有同一个 child 时,我删除了 parent ,似乎 InnoDB 应该能够“弄清楚”并让级联通过整个家庭(即删除 parent 也会删除叔叔和 child )。但是,相反,我得到以下信息:

  ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`cascade_test/uncle`, CONSTRAINT `fk_child` FOREIGN KEY (`childid`) REFERENCES `child` (`id`))

InnoDB 正在尝试在引用它的 Uncle 之前级联删除 Child。

我错过了什么吗?这应该是否由于某种我不明白的原因而失败?或者有什么技巧可以让它工作(或者它是 MySQL 中的一个错误)?

最佳答案

在更简单的情况下,如果从 Child 中删除一条记录并且它有一个引用 Uncle 会发生什么?这是未指定的,因此无论如何约束都会失败。

如果删除 Child 不会删除其 Uncles,那么会发生什么? Uncle.childid 不能为空。

你想要的是以下三件事之一:

  1. Uncle.childid 可以为 null,并且您希望为 childid 设置 ON DELETE SET NULL。
  2. Uncle.childid 不能为 null,并且您希望 ON DELETE CASCADE for childid。
  3. Childid 不属于 Uncle,并且您希望 ChildsUncle 关系具有对 Child 和 Uncle 的 ON DELETE CASCADE 外键约束。 Uncleid 将是该关系的候选键(即它应该是唯一的)。

关于mysql - 以什么顺序处理 ON DELETE CASCADE 约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60168/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com