如何在不引用 parent 的情况下对 children 进行级联删除
How to CASCADE deletion to children without reference to the parent
是否可以在 parent
删除时将 child
行的级联删除应用于此 MySQL 架构?
CREATE TABLE parent (
id INTEGER,
specialChildrenId INTEGER,
PRIMARY KEY (id)
)
-- Always 1:1 related to whatever references it
-- (not necessarily referenced by parent)
CREATE TABLE child (
id INTEGER,
PRIMARY KEY (id)
)
我无法将 child
的引用引用到 parent
,因为在我的应用程序中 child
可以是 1:1 与 parent
相关或 1:1 与另一个完全不同的 table.
相关
作为一个好习惯,您应该始终将外键放在子 table 中,如果它引用另一个 table,则添加另一个外键。在这种情况下,您的删除查询将如下所示:
delete from child where parent_id=#{parentId}
但在您的情况下,您必须使用此查询:
delete from child where id=
(select specialChildrenId from parent where id=#{parentId})
您可以在两个(或更多)父表上添加触发器以在删除之前删除子行,如下所示:
delimiter |
CREATE TRIGGER tr_parent_delete BEFORE DELETE ON parent
FOR EACH ROW
BEGIN
DELETE FROM child WHERE id = OLD.specialChildrenId;
END;
|
delimiter ;
是否可以在 parent
删除时将 child
行的级联删除应用于此 MySQL 架构?
CREATE TABLE parent (
id INTEGER,
specialChildrenId INTEGER,
PRIMARY KEY (id)
)
-- Always 1:1 related to whatever references it
-- (not necessarily referenced by parent)
CREATE TABLE child (
id INTEGER,
PRIMARY KEY (id)
)
我无法将 child
的引用引用到 parent
,因为在我的应用程序中 child
可以是 1:1 与 parent
相关或 1:1 与另一个完全不同的 table.
作为一个好习惯,您应该始终将外键放在子 table 中,如果它引用另一个 table,则添加另一个外键。在这种情况下,您的删除查询将如下所示:
delete from child where parent_id=#{parentId}
但在您的情况下,您必须使用此查询:
delete from child where id=
(select specialChildrenId from parent where id=#{parentId})
您可以在两个(或更多)父表上添加触发器以在删除之前删除子行,如下所示:
delimiter |
CREATE TRIGGER tr_parent_delete BEFORE DELETE ON parent
FOR EACH ROW
BEGIN
DELETE FROM child WHERE id = OLD.specialChildrenId;
END;
|
delimiter ;