2017国民行业分类sql-存储过程_存储函数-MySQL

2017国民行业分类sql-存储过程_存储函数-MySQL


目录




内容

1、场景

基于项目需求需要一个行业分类表,在网上搜索之后,得到如图的一个表:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKPixiRf-1606484136758)(./images/2020-11-27_pc-industry.png)]

  • 需求:

    • 把主键改为int 自增
    • 字段名改为id、name、code、parent_id
  • 效果图示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BHFi2CMn-1606484136762)(./images/2020-11-27_pc-industry-optimaze.png)]

2、过程

  • 字段改名没什么好说的,偷懒直接用navicat改了

  • 那么如何根据parentid(原字段ParentId)把parent_id设置为它的父级id值呢?

  • 思路

    1. 原表对应关系parentid 对应code
    2. 找到和parentid相等code的记录的id
    3. 把id赋值给parent_id
  • 实现

    1. 刚开始直接肉眼找,太费事了 1772条数据呢
    2. 一个一个取parentid select id from tb_industry where code = xxx,手动赋值,效率高了一点点
    3. update tb_industry set parent_id = xxx where parentid = yyyxxx为上面获取的id,效率又提高了一点
    4. 有没有办法能自动全部改造号呢?这时候我们想到了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

猜你喜欢

转载自blog.csdn.net/gaogzhen/article/details/110247570
今日推荐