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

SQLite delete shared row when last reference to it deleted

我阅读了级联删除的文档,但我不清楚的是,是否可以设置一个数据库,以便一个子行可以被多个父级共享,并且子行只能被当 last 引用父行被删除时被删除?

(基本上我想要外键像 std::shared_ptr。)

如果内置的 CASCADE DELETE 设置无法做到这一点,是否可以使用触发器来完成?那会是什么样子?

我的最后一个选择是,尽管在我正在编写的库中可能创建这种共享引用情况,但我可以简单地让它在以下情况下抛出异常尝试构建这样的东西。

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

的两行

C++ 类 被编写为在其构造函数中插入 table 行并在其析构函数中删除 table 行。本质上,我希望 C++ 代码中临时对象的创建和销毁能够反映在数据库的状态中。但是我想禁止删除子行,如果它仍然被不同的父级引用。

这可以通过 trigger 实现。

当没有parents与child相同时,删除child:

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;