如何删除sql中的树结构?

llycmphe  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(466)

我有一个问题,如果我删除了第一行id,那么父id将不会在表中删除。
这是我的示例表结构,表名为表1:

----------------------
id | name  | parent_id
----------------------
1    Tom       0
5    Shawn     1
11   Jack      5
13   John      5
20   David     5
33   Howard    11
35   Owen      33

例如 Case 1 :
如果我删除tom,下面的父\ u id将一起删除。这意味着所有数据都将被清除。
例如 Case 2 :
如果我删除shawn,下面的父\ u id将一起删除。也就是说把汤姆留在table上了
例如 Case 3 :
如果我删除杰克,杰克,霍华德和欧文将被删除。
例如 Case 4 :
如果我删除约翰,只有约翰会被删除。
我的树结构如下图所示:

希望有人能给我指点迷津。我试着找到findnextchildid来测试,它不能工作,也许我不知道如何使用它。谢谢。

2g32fytz

2g32fytz1#

你可以用 foreign key 约束 cascade 来自 on delete 子条款。为此,我更改了列的定义 parent_id 在table上 table_1 . 由于您还没有确定使用哪种dbms,所以我使用mysql v5.5。

create table table_1(
  id integer not null primary key,
  name varchar(15),
  parent_id integer null default null,
  foreign key(parent_id)
    references table_1(id)
    on delete cascade
);

insert into table_1(id, name, parent_id) values
  (1, 'Tom', null),
  (5, 'Shawn', 1),
  (11, 'Jack', 5),
  (13, 'John', 5),
  (20, 'David', 5),
  (33, 'Howard', 11),
  (35, 'Owen', 33);

create table names(name varchar(15));

insert into names(name) values ('Tom'), ('Shawn'), ('Jack'), ('John');

delimiter $$
create procedure test() begin
  declare v_name varchar(15);
  declare fetched int default true;
  declare c cursor for select name from names;
  declare continue handler for not found set fetched = false;
  open c;
  fetch c into v_name;
  while fetched do
    select v_name;
    start transaction;
      delete from table_1 where name = v_name;
      select * from table_1;
    rollback;
    fetch c into v_name;
  end while;
  close c;
end$$
delimiter ;

select * from table_1;
call test();

演示。

相关问题