Joe.xu 发表于 2023-6-8 18:39:51

一看就会,超有用活字格技能:一百七十五、主打的就是快,执行SQL批量提交主子表数据

本帖最后由 Joe.xu 于 2023-6-20 14:00 编辑

本帖适用于Mysql/Sql server 数据库批量提交主子表数据的场景,数据越多,本帖提升的性能越明显:lol,其他外联库应该可以也有类似的方法,

如果有格友提到,后续再做补充~


进入正题,在大家平时的业务实现中,应该不乏同时提交主子表的场景,比如下图,



如果在服务端实现的话,
就需要先提交主表数据,然后再循环添加子表数据,如果子表数据多,相对应的循环次数就不会少,
进而会有一定的性能损耗

如果是Mysql数据库的话,可以这样来实现
(1)拿到主子表数据,调用服务端命令,这一步跟正常调用服务端命令一样,就不过多解释了



(2)直接一个执行sql命令,完成添加


浅析一下Sql,主要分为三块
//一、先插入主表数据
Insertinto`mysql订单表`(`订单编号`,`订单名称`,`订单状态`) values
(?订单编号 ,?订单名称 ,?订单状态 );
//二、获取主表的ID
SET   @主ID = @@identity;
//三、解析传过来的子表数据,批量插入到主表中
insert into`mysql订单详情表` (`订单ID`,`物品`,`数量`,`备注`)
select@主ID,tt.id, tt.num ,tt.note fromJSON_TABLE(
?订单子表,"$[*]"COLUMNS(
id VARCHAR(100) PATH"$.ID",
num VARCHAR(100) PATH"$.num",
note VARCHAR(100) PATH"$.note "
)
)tt



这个SQL中,MVP必定是JSON_TABLE这个函数,原理替大家百度了一下
MySQL JSON_TABLE() 函数_json_table mysql_悠游134的博客-CSDN博客

如果是Sql server数据库的话,
步骤其实跟Mysql差不多,也是一个sql完成


sql为
//一、先插入主表数据Insertinto([订单编号],[订单名称],[订单状态]) values
(@订单编号,@订单名称,@订单状态);//二、获取主表的ID
declare@主ID int = @@identity;//三、解析传过来的子表数据,批量插入到主表中
INSERT INTO (
[订单ID], [物品] ,[数量] , [备注]
)
SELECT
   @主ID, x., x., x.
FROM OPENJSON(@订单子表) WITH (
      id int N'$.ID',
      numintN'$.num',
      note nvarchar(100) N'$.note'
)as x
这个SQL中,MVP就是OPENJSON这个函数,原理替大家百度了一下
sqlserver通过OPENJSON转换 json数据_sqlserver openjson_slilx的博客-CSDN博客


大家在使用的时候,注意下自己数据库的版本是否支持这两个函数,
demo给呈上,仅供参考,外联库大家不一定能运行;P





willning 发表于 2023-6-15 09:14:59

补充一下这两个语法的最低版本
JSON_TABLE: MySQL 8.0
OPENJSON:SQL Server 2016,或者数据库COMPATIBILITY_LEVEL不小于130的更新版本
页: [1]
查看完整版本: 一看就会,超有用活字格技能:一百七十五、主打的就是快,执行SQL批量提交主子表数据