删除最后一次引用时,SQLite删除共享行

时间:2016-07-29 16:34:56

标签: c++ database sqlite sql-delete delete-row

我阅读了级联删除的文档,但我不清楚的一件事是,是否可以设置数据库,以便子行可以由多个父共享,而子行只能在删除时删除最后引用父行被删除了吗?

(基本上我希望外键的作用类似于std :: shared_ptr。)

如果使用内置CASCADE DELETE设置无法实现,可以使用触发器完成吗?那会是什么样的?

我有的最后一个选项是,虽然我正在编写库中的可能来创建这个共享引用的情况,但我可以简单地让它在尝试构造这样的时候抛出异常发生了一件事。

具体来说,我有一个自引用表,它存储类似抽象语法树的东西。每个节点都有一个操作和两个子节点。在使用数据库的C ++程序中,表示此表中行的对象具有重载的运算符,这些运算符返回的值同时导致在表中创建行。例如,“a<< b”将返回临时值“c”,并且数据库将具有如下行:(c_id,'<<<',a_id,b_id)。但是,您可以通过调用“a<< x”来执行此操作,在这种情况下,数据库将包含引用“a”的两行。

编写C ++类是为了在构造函数中插入表行,并在析构函数中删除表行。本质上,我希望在C ++代码中创建和销毁临时对象,以便在数据库的状态下进行镜像。但是我想要禁止删除子行,如果它仍然被另一个父行引用。

1 个答案:

答案 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;