我的postgres数据库有问题。我有一个包含三列的表Tasks
:ID,名称和Parent_ID(引用此表中的另一个任务ID):
id | name | parent_id
---+------+-----------
1 | A | 0
2 | B | 1
3 | C | 2
4 | D | 1
5 | E | 0
6 | F | 0
所以基本上就是这样:
1. A
2. B
3. C
4. D
5. E
6. F
[我要做的是删除任务A,并删除其所有子代以及所有子代的子代等等。(在这种情况下,B和D,以及C为其删除的B子代)像级联删除,但我不能做到这一点。也许任何功能都可以工作?
删除后的结果应为
id | name | parent_id
---+------+-----------
5 | E | 0
6 | F | 0
希望你们能帮助我。
您可以使用递归查询从起始名称构建所有后代行的列表,然后将其用作删除的过滤器。
with recursive cte(id, parent_id) as (
select id, parent_id from mytable where name = 'A'
union all
select t.id, t.parent_id from mytable t inner join cte c on c.id = t.parent_id
)
delete from mytable where id in (select id from cte)
Demo on DB Fiddle-执行查询后的表内容:
id |名称| parent_id-:| :--- | --------:5 | E | 06 | F | 0