SQLite在最后一次引用共享行时删除该行
SQLite delete shared row when last reference to it deleted
我阅读了级联删除的文档,但有一件事我不清楚,是否可以设置一个数据库,使子行可以由多个父行共享,并且只有在删除最后一个引用的父行时才能删除子行?
(基本上,我想要像std::shared_ptr一样的外键。)
如果内置的CASCADE DELETE设置不可能做到这一点,可以用触发器完成吗?那会是什么样子?
我的最后一个选择是,尽管在我正在编写的库中创建这种共享引用情况是可能的,但当尝试构建这样的东西时,我可以简单地让它抛出异常。
具体来说,我有一个自引用表,它存储一些类似于抽象语法树的东西。每个节点都有一个操作和两个子节点。在我使用数据库的C++程序中,表示该表中行的对象具有重载运算符,这些运算符返回的值同时导致在表中创建行。例如,"a<<b"将返回一个临时值"c",数据库将有一行,如:(c_id,'<<',a_id,b_id)。但是,您可以调用"a<<x",在这种情况下,数据库将包含引用"a"的两行。
编写C++类是为了在其构造函数中插入表行,并在其析构函数中删除表行。从本质上讲,我希望C++代码中临时对象的创建和销毁在数据库的状态中得到镜像。但是,如果子行仍被其他父行引用,我希望禁止删除它。
这可以通过触发器实现。
当没有父母留下相同的孩子时,删除孩子:
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;
相关文章:
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 从矢量或地图中删除共享指针
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 如何通过指向元组的共享指针删除对象
- 提升进程间共享内存删除、权限和输出文件
- 使用有序映射删除共享指针
- 调用 shmdt() 后无法删除共享内存段
- 唯一/共享 ptr 用于在数组超出范围后自动删除阵列
- 升级分解共享内存删除对象而无需销毁
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 如何从集合中删除共享的 PTR 元素
- 提升共享指针自定义删除器示例
- 如何解决删除其他人之间共享的对象的问题
- 使用共享_ptr删除列表中的对象
- 删除与其他类共享的指针
- CreateFileMapping() 即使在重新启动后也会返回"already exists";如何删除旧的命名共享内存?
- 从 Android NDK 共享对象中删除异常/展开函数
- C++析构函数删除共享内存
- 提升中的异常:进程间,共享内存对象删除
- 我可以隐藏或删除共享库中的类名吗