【发布时间】:2016-02-07 15:30:38
【问题描述】:
所以,我得到:
错误代码:1451。无法删除或更新父行:外键 约束失败(
playground.Person, CONSTRAINTsk_Person_Parent外键 (parent_id) 引用Person(id) 删除级联 更新级联)
这是一个简单的表,引用自身:
CREATE TABLE IF NOT EXISTS Person (
id int not null primary key,
name varchar(100) not null,
parent_id int null,
CONSTRAINT `sk_Person_Parent`
FOREIGN KEY (parent_id)
REFERENCES Person (id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
如您所见,有“ON UPDATE CASCADE”。 我在其中插入 4 个简单的行:
INSERT INTO Person(id, name, parent_id)
VALUES
(1, 'vasko', NULL),
(2, 'asdas', 1),
(3, 'ivo', 1),
(4, 'anton', 3);
所以我有 1 - 瓦斯科 2 - asdasd 3 - 伊沃 4 - 安东。 当我按 id 1 删除时,由于 ON DELETE CASCADE,所有记录都会被擦除。但是,如果我尝试执行
UPDATE Person
SET id=10
WHERE id=1;
我得到了给定的错误。有什么想法吗?
(我预计vasil的id会变成10,接下来2行的parent_id会更新到10)
【问题讨论】:
-
这是一种有趣的外键方法。问题是:当您尝试更改 id 时,这实际上并不常见,但假设这很好,它首先尝试更改外键 - 因为 id=10 尚不存在,所以它失败。只是我没有看到任何解决方法可以轻松解决它,并且好奇是否有任何解决方法(也许使用临时表方法除外)。
-
好吧,我正在阅读一本 db 书籍,并且有一个关于层次结构的主题,所以我想尝试一下,然后我想到了这个。没有对我的项目工作至关重要的问题,只是想知道。
-
ON UPDATE CASCADE 在这个结构中看起来没用。对于受影响的记录,我必须手动管理它。正如我所说,我真的很想知道是否有解决方法。
-
好吧,我很好奇在什么情况下 ON UPDATE CASCADE 还是有用的?我的意思是FK总是指向一个PK,所以如果这不起作用,它会在哪里使用?
-
没关系,我回答了我的问题 - 如果 FK 来自另一个表,它可以正常工作。如果您想更新自引用表,您似乎需要使用某种触发器。
标签: mysql sql cascade onupdate