树形菜单 的mysql 存储过程实现增删查
2015-12-30 17:42
621 查看
添加:入参:IN nodename VARCHAR(50),IN pageUrl VARCHAR(50),IN type INT,IN pid INT
BEGIN
DECLARE declLID INT default -1;
DECLARE declRID INT default -1;
DECLARE declNID INT default 0;
DECLARE declTree INT default -1;
DECLARE declNkID INT default -1;
DECLARE declCNT INT default 0;
set declNkID=(select count(*)+1 from t_plat_admin_left_tree);
SET declCNT =(select count(*) from t_plat_admin_left_tree);
SELECT declNkID;
IF declCNT <=0 THEN
-- 根节点赋初值
SELECT declLID,declRID,declNID,declTree,declNkID,declCNT;
INSERT INTO t_plat_admin_left_tree(id,LID,RID,Tree,NodeName,fid,tp) VALUES (0,1,2,0,'根节点',-1,0) ;
else
BEGIN
IF pid = 0 then
SELECT tpal.RID into declRID FROM t_plat_admin_left_tree tpal WHERE ID=pid;
SET declNID=declRID/2;
UPDATE t_plat_admin_left_tree SET RID = RID + 2 WHERE id=0;
INSERT INTO t_plat_admin_left_tree(id,LID,RID,Tree,NodeName,fid,tp) VALUES (declNID,declRID,declRID + 1,1,NodeName,PID,TYPE) ;
ELSE
SELECT LID, RID, Tree + 1 INTO declLID,declRID,declTree
FROM t_plat_admin_left_tree WHERE ID = PID;
SET declNID=pid+(declRID-declLID+1)/2;
UPDATE t_plat_admin_left_tree SET RID = RID + 2 WHERE RID >= declRID ;
UPDATE t_plat_admin_left_tree SET LID = LID + 2 WHERE LID > declRID ;
UPDATE t_plat_admin_left_tree SET ID = ID + 1 WHERE LID > declRID;
UPDATE t_plat_admin_left_tree SET fID = fID + 1 WHERE fid> pid AND RID>declRID;
INSERT INTO t_plat_admin_left_tree(id,LID,RID,Tree,NodeName,fid,tp) VALUES (declNID,declRID,declRID + 1,Tree,NodeName,pid,type) ;
end if;
END;
end if;
SELECT declNkID ;
select * from t_plat_admin_left_tree;
END
删除:入参:IN `inid` int
BEGIN
DECLARE delcLID INT DEFAULT 0;
DECLARE delcRID INT DEFAULT 0;
DECLARE delcWID INT DEFAULT 0;
DECLARE delcDID INT DEFAULT 0;
DECLARE delcNUM int DEFAULT 0;
-- set @NUM=delcNUM;
-- select id,lid,rid,wid from t_plat_admin_left_tree tpaf where tpaf.id=id;
SELECT tpaf.ID, tpaf.LID, tpaf.RID, RID - LID + 1 into delcDID ,delcLID ,delcRID,delcWID FROM t_plat_admin_left_tree tpaf WHERE tpaf.ID = inid ;
IF delcDID != 0 THEN
select delcWID/2 into delcNUM;
SELECT delclid,delcrid,delcWID,inid;
SELECT * FROM t_plat_admin_left_tree WHERE LID BETWEEN delcLID AND delcRID;
DELETE FROM t_plat_admin_left_tree WHERE LID BETWEEN delcLID AND delcRID;
UPDATE t_plat_admin_left_tree SET RID = RID - delcWID WHERE RID > delcRID;
UPDATE t_plat_admin_left_tree SET LID = LID - delcWID WHERE LID > delcRID ;
update t_plat_admin_left_tree set ID=ID-delcNUM where ID>inid;
update t_plat_admin_left_tree set FID=FID-delcNUM where FID>delcID;
END IF;
SELECT delcDID ;
END
查询:入参:IN pid int ,IN delctree int
BEGIN
SELECT Z.ID,z.lid,z.rid,Z.Tree,Z.NodeName,z.fid,z.tp
FROM t_plat_admin_left_tree Z,t_plat_admin_left_tree P
WHERE P.ID=pid AND Z.LID>=P.LID AND Z.RID <=P.RID AND (delctree = 0 OR Z.Tree<=P.Tree+delctree)
ORDER BY Z.LID ASC;
END
添加:入参:IN nodename VARCHAR(50),IN pageUrl VARCHAR(50),IN type INT,IN pid INT
BEGIN
DECLARE declLID INT default -1;
DECLARE declRID INT default -1;
DECLARE declNID INT default 0;
DECLARE declTree INT default -1;
DECLARE declNkID INT default -1;
DECLARE declCNT INT default 0;
set declNkID=(select count(*)+1 from t_plat_admin_left_tree);
SET declCNT =(select count(*) from t_plat_admin_left_tree);
SELECT declNkID;
IF declCNT <=0 THEN
-- 根节点赋初值
SELECT declLID,declRID,declNID,declTree,declNkID,declCNT;
INSERT INTO t_plat_admin_left_tree(id,LID,RID,Tree,NodeName,fid,tp) VALUES (0,1,2,0,'根节点',-1,0) ;
else
BEGIN
IF pid = 0 then
SELECT tpal.RID into declRID FROM t_plat_admin_left_tree tpal WHERE ID=pid;
SET declNID=declRID/2;
UPDATE t_plat_admin_left_tree SET RID = RID + 2 WHERE id=0;
INSERT INTO t_plat_admin_left_tree(id,LID,RID,Tree,NodeName,fid,tp) VALUES (declNID,declRID,declRID + 1,1,NodeName,PID,TYPE) ;
ELSE
SELECT LID, RID, Tree + 1 INTO declLID,declRID,declTree
FROM t_plat_admin_left_tree WHERE ID = PID;
SET declNID=pid+(declRID-declLID+1)/2;
UPDATE t_plat_admin_left_tree SET RID = RID + 2 WHERE RID >= declRID ;
UPDATE t_plat_admin_left_tree SET LID = LID + 2 WHERE LID > declRID ;
UPDATE t_plat_admin_left_tree SET ID = ID + 1 WHERE LID > declRID;
UPDATE t_plat_admin_left_tree SET fID = fID + 1 WHERE fid> pid AND RID>declRID;
INSERT INTO t_plat_admin_left_tree(id,LID,RID,Tree,NodeName,fid,tp) VALUES (declNID,declRID,declRID + 1,Tree,NodeName,pid,type) ;
end if;
END;
end if;
SELECT declNkID ;
select * from t_plat_admin_left_tree;
END
删除:入参:IN `inid` int
BEGIN
DECLARE delcLID INT DEFAULT 0;
DECLARE delcRID INT DEFAULT 0;
DECLARE delcWID INT DEFAULT 0;
DECLARE delcDID INT DEFAULT 0;
DECLARE delcNUM int DEFAULT 0;
-- set @NUM=delcNUM;
-- select id,lid,rid,wid from t_plat_admin_left_tree tpaf where tpaf.id=id;
SELECT tpaf.ID, tpaf.LID, tpaf.RID, RID - LID + 1 into delcDID ,delcLID ,delcRID,delcWID FROM t_plat_admin_left_tree tpaf WHERE tpaf.ID = inid ;
IF delcDID != 0 THEN
select delcWID/2 into delcNUM;
SELECT delclid,delcrid,delcWID,inid;
SELECT * FROM t_plat_admin_left_tree WHERE LID BETWEEN delcLID AND delcRID;
DELETE FROM t_plat_admin_left_tree WHERE LID BETWEEN delcLID AND delcRID;
UPDATE t_plat_admin_left_tree SET RID = RID - delcWID WHERE RID > delcRID;
UPDATE t_plat_admin_left_tree SET LID = LID - delcWID WHERE LID > delcRID ;
update t_plat_admin_left_tree set ID=ID-delcNUM where ID>inid;
update t_plat_admin_left_tree set FID=FID-delcNUM where FID>delcID;
END IF;
SELECT delcDID ;
END
查询:入参:IN pid int ,IN delctree int
BEGIN
SELECT Z.ID,z.lid,z.rid,Z.Tree,Z.NodeName,z.fid,z.tp
FROM t_plat_admin_left_tree Z,t_plat_admin_left_tree P
WHERE P.ID=pid AND Z.LID>=P.LID AND Z.RID <=P.RID AND (delctree = 0 OR Z.Tree<=P.Tree+delctree)
ORDER BY Z.LID ASC;
END
相关文章推荐
- 数据库链接 mysql,sqlserver
- MySQL工具汇总
- mysql中有大量sleep进程的原因与解决办法
- mysql 线程等待时间,解决sleep进程过多的办法
- MySQL数据库的一些简单操作
- mysql 删除当前数据库所有表
- MySQL修改数据表中的字段名
- 深入研究mysql中group by与order by取分类最新时间内容
- Mysql安装包下载
- mysql的主从复制
- 慢查询日志分析工具mysqldumpslow
- MySQL优化:使用慢查询日志定位效率较低的SQL语句
- Mysql数据库乱码问题
- MySQL数据库性能优化的关键参数
- mysql 查看binlog 操作日志及恢复数据
- 在windows下直接使用Mysql压缩包的操
- MySQL慢查询开启及分析方法
- MySQL性能优化总结
- Mysql一个索引问题
- MySQL 字符编码