我阅读了级联删除的文档,但我不清楚的一件事是,是否可以设置数据库,以便子行可以由多个父共享,而子行只能在删除时删除最后引用父行被删除了吗?
(基本上我希望外键的作用类似于std :: shared_ptr。)
如果使用内置CASCADE DELETE设置无法实现,可以使用触发器完成吗?那会是什么样的?
我有的最后一个选项是,虽然我正在编写库中的可能来创建这个共享引用的情况,但我可以简单地让它在尝试构造这样的时候抛出异常发生了一件事。
具体来说,我有一个自引用表,它存储类似抽象语法树的东西。每个节点都有一个操作和两个子节点。在使用数据库的C ++程序中,表示此表中行的对象具有重载的运算符,这些运算符返回的值同时导致在表中创建行。例如,“a<< b”将返回临时值“c”,并且数据库将具有如下行:(c_id,'<<<',a_id,b_id)。但是,您可以通过调用“a<< x”来执行此操作,在这种情况下,数据库将包含引用“a”的两行。
编写C ++类是为了在构造函数中插入表行,并在析构函数中删除表行。本质上,我希望在C ++代码中创建和销毁临时对象,以便在数据库的状态下进行镜像。但是我想要禁止删除子行,如果它仍然被另一个父行引用。
答案 0 :(得分:1)
这可以使用trigger。
如果没有留下同一孩子的父母,请删除孩子:
CREATE TRIGGER t
AFTER DELETE ON Parent
WHEN NOT EXISTS (SELECT 1 FROM Parent WHERE ChildID = OLD.ChildID)
BEGIN
DELETE FROM Child WHERE ID = OLD.ChildID;
END;