2017国民行业分类sql-存储过程_存储函数-MySQL
目录
内容
1、场景
基于项目需求需要一个行业分类表,在网上搜索之后,得到如图的一个表:
-
需求:
- 把主键改为int 自增
- 字段名改为id、name、code、parent_id
-
效果图示:
2、过程
-
字段改名没什么好说的,偷懒直接用navicat改了
-
那么如何根据parentid(原字段ParentId)把parent_id设置为它的父级id值呢?
-
思路
- 原表对应关系parentid 对应code
- 找到和parentid相等code的记录的id
- 把id赋值给parent_id
-
实现
- 刚开始直接肉眼找,太费事了 1772条数据呢
- 一个一个取parentid
select id from tb_industry where code = xxx
,手动赋值,效率高了一点点 update tb_industry set parent_id = xxx where parentid = yyy
xxx为上面获取的id,效率又提高了一点- 有没有办法能自动全部改造号呢?这时候我们想到了MySQL的存储函数和存储过程,实现如下
2.1、存储函数
-
根据parentid查询对应的id,有输入又输出定义一个存储函数getPid,详细如下:
delimiter $$ CREATE FUNCTION `getPid`(parentid varchar(255)) RETURNS int(11) DETERMINISTIC BEGIN RETURN(select id from tb_industry where code = parentid); END $$ delimiter ;
2.2、游标和存储过程
-
查询全部parentid,遍历获取并设置parent_id的值,遍历需要游标;然后只需要执行sql,用个存储过程
delimiter $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `setPid`() DETERMINISTIC begin -- 注意 接收游标值为中文时 需要 给变量 指定 字符集为utf8 declare pid varchar(255) character set utf8; -- 游标结束的标志 declare done int default 0; -- 声明游标 declare cur cursor for select parentid from tb_industry; -- 指定游标循环结束时的返回值 declare continue handler for not found set done = 1; -- 打开游标 open cur; -- while 循环 while done != 1 do fetch cur into pid; if done != 1 then update tb_industry set parent_id = getPid(pid) where parentid = pid; end if; end while; -- 关闭游标 close cur; end $$ delimiter ;
-
执行存储过程
call setPid();
最终完成我们相应的效果,下面附上原版2017国民经济行业sql和改造之后的sql
3、2017国民经济sql
因为数据条数有点多,不让一起发,这里把sql文件放置在csdn下载===传送门===
后记 :
欢迎交流,本人QQ:806797785
项目源代码地址:https://gitee.com/gaogzhen