我们在SqLite中有三个表表示的树结构:
CREATE TABLE IF NOT EXISTS "root_nodes" (
"id" INTEGER NOT NULL,
-- other stuff
PRIMARY KEY("id")
);
CREATE TABLE IF NOT EXISTS "inner_nodes" (
"id" INTEGER NOT NULL,
"parent" INTEGER NOT NULL,
-- other stuff
PRIMARY KEY("id")
);
CREATE TABLE IF NOT EXISTS "leaf_nodes" (
"id" INTEGER NOT NULL,
"parent" INTEGER NOT NULL,
-- other stuff
PRIMARY KEY("id")
);
字符串
比如,在这个例子中,树的高度是3(根节点、内部节点和叶节点层),但实际上可能有几个内部节点层,但数量不变。
给定一个根节点,我需要删除它的所有后代内部节点和叶节点,并返回删除的叶节点。理想情况下,在一个SQL语句中。
我的第一个尝试是做嵌套的CNOFFROM语句,像这样:
DELETE FROM leaf_nodes WHERE parent IN (
DELETE FROM inner_nodes WHERE parent IN (
DELETE FROM root_nodes WHERE id = ? RETURNING id
) RETURNING id
) RETURNING id
型
但后来我了解到RETURNING
只在top-level DELETE
, INSERT
and UPDATE
statements中可用,所以这似乎是一个死胡同。
我们目前使用触发器实现了这一点,但是如果我们需要收集删除的叶子节点,那么(AFAIK)就不起作用了。
1条答案
按热度按时间jmo0nnb31#
也许可以考虑使用以下组合:
1.使用
ON DELETE CASCADE
自动删除子项的外键,以及1.用于收集删除ID的表,以及
AFTER DELETE
触发器自动将插入填充到集合表中。这将允许被删除的id的,以获得作为和当想要的
下面是一个demo:
字符串
运行结果
的数据
的
的
大约60行后
的
的
所有这一切表明,第一行输出是rootnodes id 2,没有rootnodes id 1(或3、5、7或9)的行