存储过程--树的插入、遍历、删除
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DECLARE CONTINUE HANDLER FOR NOT FOUND SET b =-1;
将符合条件的节点插入到遍历表中: (存储过程为StoreTravelData)
为了下一步界面设计,限制了每次查询显示的深度和宽 度,因此对要插入的节点进行判断,只有深度和宽度 在要遍历的深度和宽度范围之内才会插入到遍历表中
• 具体实现
1. 要删除的节点如果为根节点,直接遍历树,然后初始化这棵树 2. 查询树中是否有当前节点,如果有插入到临时表中 3. 当删除表不空时,从临时表中取节点id,并将tree中pid为当前节 点id的id插入到临时表中。同时从临时表中删除该节点。将节点信 息插入到删除表中。
13:14:17
7
auto_increment, tree_id int,pid int);
13:14:17
9
删除表
create table if not exists del_table( id int primary key auto_increment, tree_id int, pid int );
插入临时表
生产实习验收报告
MySQL存储过程分析与应用
13:14:17
1
我的项目:利用存储过程实现树的操作——初始化
• 树的创建
– 设计树的存储格式 选择双亲表示法,即:id—自己的id,pid—父节 点id delimiter // – 存储过程实现,即运用 create procedure InitTree() 存储过程创建表
select count(*) into bExist from tree where tree.id = parent_id; if bExist = 1 then
13:14:17
insert into tree(pid,id) values(parent_id,id);
3
我的项目:利用存储过程实现树的操作——遍历
13:14:17
8
我的项目:利用存储过程实现树的操作
• 主要表结构
树
create table tree( id integer primary key, pid integer not null );
遍历表 create table if not exists travel_table(id int primary key
我的项目:利用存储过程实现树的操作——删除
• 插入临时表中
– 从临时表中选取节点id,然后从树中选择所有父节点是当前节点id 的节点,然后插入到临时表中。在这里同样用到了游标,实现对 结果集的单一提取。
• 插入到删除表中
– 当要删除的节点为根节点,即:删除整棵树时,直接初始化这棵 树,没有插入到删除表中。 – 当要删除的节点不是根节点时,将从临时表中选择的节点插入到 删除表中。
• 树的遍历
– 实现方法
• 利用临时表充当队列,实现对树的按层遍历 临时表的设计 create temporary table if not exists tem_table(
id int primary key AUTO_INCREMENT,
tree_id int , dep int, wid int );
BEGIN
drop table if exists tree; create table tree( id integer primary key,
13:14:17
pid integer n用存储过程实现树的操作——插入
• 利用存储过程实现树的插入
– 存储过程的语法
delimiter //
create procedure call InsertTree(pid,id,@re); InsertTree(parent_id integer,id @re 作为判断插入是否成功的标志 integer,inout re int) pid为要插入节点的父节点id BEGIN id为要插入的节点 declare bExist integer;
13:14:17
6
我的项目:利用存储过程实现树的操作——删除
• 实现思想:
– 利用临时表充当队列,将要删除的节点的子孙节点删除 – 临时表 create temporary table if not exists d_table( id int primary key auto_increment, tid int);
create temporary table if not exists tem_table(id int primary key AUTO_INCREMENT, tree_id int ,dep int, wid int);
13:14:17
10
删除临时表
create temporary table if not exists d_table(id int primary key auto_increment,tid int );
将父节点为当前节点的节点插入到临时表中: 存储过程为 StoreData 将符合条件的节点插入到遍历表中: 存储过程为StoreTravelData
13:14:17
5
我的项目:利用存储过程实现树的操作——遍历
将父节点为当前节点的所有节点插入到临时表中
(存储过程为 StoreData)
由于在存储过程中对结果集的select into 运行时提示出错,所以选用 了游标进行结果的提取。 declare cur CURSOR FOR SELECT tree.id from tree,tem_table where tem_table.id = startid and tree.pid = tem_table.tree_id ;
13:14:17
4
我的项目:利用存储过程实现树的操作——遍历
• 具体实现
1. 将要遍历的节点的id插入到临时表中 2. 当临时表不空时,从临时表中取节点id,并将tree中pid为当前节 点id的id插入到临时表中。当该节点符合深度和宽度的限制时,插 入到遍历表中。将该节点信息从临时表中删除。 3. 查询遍历表得到遍历结果
13:14:17
11
我的收获
• 对数据结构中递归和树等数据结构的理解更加深刻
运用非递归实现树的遍历,删除等操作
• 对mysql的基本操作更加熟悉
对sql语句的语法,限制等有了更深的理解 能运用存储过程实现基本的mysql操作
13:14:17
12
13:14:17
13