MySql存储过程拆分JSON数组插入子表

1、业务背景

     由于之前的各种版本因素,将主子表数据是以json进行存储的,主表里面存储子表的json array,由于联合查询效率太低,故需要将其拆分成主子表,但是之前的业务数据必须要导入到新表,这里介绍一下整体处理的思路,以及具体的处理方式。

    之前的数据如下图所示:

    

   需要转换成的子表结构

CREATE TABLE `powoms_ultimate`.`Untitled`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `parent_id` int NULL,
  `code` varchar(255) NULL,
  `name` varchar(255) NULL,
  PRIMARY KEY (`id`)
);

2、思路考处理方式及方式的优缺点

      方式1:采用java代码读取解析

               优点:好实现

               缺点:接口只能使用一次,以后就用不上,放在项目中,感觉很别扭,浪费资源

    方式2:mysql脚本解析

             缺点:mysql 基础语法对于不定长的json数组的支持不是很到位,很难搞

            优点:相对于方式1来说是减少java项目的无用代码和接口

            尝试:使用mysql的help_topic将多列转换成一列数据,存入临时表进行解析,参考博客地址

    方式3: 使用mysql 存储过程+游标遍历的形式进行解析

           缺点:需要熟悉mysql 存储过程和 游标的语法,上手难

          优点:减少java项目无用的接口 ,可以使用循环遍历单行的数据,可更好处理数据

 

3、最终解决方案

     综上,选择第三种作为实现方案(脚本如下):

DELIMITER $
CREATE PROCEDURE `json_del`()
BEGIN
	#Routine body goes here...
	declare id2 int; #主表id
	declare json_data2 json; 
	declare json_length int;#遍历时存储临时长度的变量 
	declare count int; #本次处理总数
	declare i int DEFAULT(0); #游标循环变量
	declare j int default(0); #json 循环变量
	
	
	declare getData cursor for select id, json_data from data_table;
	select count(*) into count from data_table;
	
	open getData;
	
	repeat 
		 # 开始解析逻辑
	   fetch getData into id2,json_data2;
		 set j = 0;
	   set json_length = JSON_LENGTH(json_data2);
		 
		 repeat
		    # 判断空
				if JSON_UNQUOTE(JSON_EXTRACT(json_data2,CONCAT('$[',j,'].code'))) is not null THEN
				   insert into data_son(parent_id,code,name)
				   values(id2,JSON_UNQUOTE(JSON_EXTRACT(json_data2,CONCAT('$[',j,'].code'))),JSON_UNQUOTE(JSON_EXTRACT(json_data2,CONCAT('$[',j,'].name'))));
			  end if;
		 set j:= j+1; 
		 until j >= json_length end repeat;
  set i:= i+1;
  until i >= count end repeat;
	#关闭游标
	close getData;
	
END$
DELIMITER ;

call json_del();

DROP PROCEDURE json_del;

    最终效果:

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
拆分MySQL中的JSON数组可以使用SQL语句中的JSON函数来实现。根据提供的引用内容,可以使用以下SQL语句来拆分JSON数组: ``` SELECT JSON_UNQUOTE(JSON_EXTRACT(f, CONCAT('$\[', index, '\].name'))) AS name, JSON_UNQUOTE(JSON_EXTRACT(f, CONCAT('$\[', index, '\].value'))) AS value FROM json_test, JSON_TABLE(f, "$\[*\]" COLUMNS (index FOR ORDINALITY)) AS jt ``` 这个SQL语句使用了JSON_EXTRACT函数来提取JSON数组中的元素,并使用JSON_UNQUOTE函数来去除引号。通过使用JSON_TABLE函数,我们可以将JSON数组转换为表格形式,并使用FOR ORDINALITY选项来生成一个索引列,以便在SELECT语句中使用。 请注意,这只是一个示例SQL语句,具体的实现可能需要根据你的数据结构和需求进行调整。 #### 引用[.reference_title] - *1* *3* [MySQL数据库JSON数组拆分](https://blog.csdn.net/weixin_47139678/article/details/129161063)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [MySql存储过程拆分JSON数组插入子表](https://blog.csdn.net/qq_16291159/article/details/109652456)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值