本帖最后由 Joe.xu 于 2024-12-16 15:20 编辑
本帖适用于Mysql/Sql server 数据库批量提交主子表数据的场景,数据越多,本帖提升的性能越明显,其他外联库应该可以也有类似的方法,
如果有格友提到,后续再做补充~
进入正题,在大家平时的业务实现中,应该不乏同时提交主子表的场景,比如下图,
如果在服务端实现的话,
就需要先提交主表数据,然后再循环添加子表数据,如果子表数据多,相对应的循环次数就不会少,
进而会有一定的性能损耗
如果是Mysql数据库的话,可以这样来实现
(1)拿到主子表数据,调用服务端命令,这一步跟正常调用服务端命令一样,就不过多解释了
(2)直接一个执行sql命令,完成添加
浅析一下Sql,主要分为三块
- //一、先插入主表数据
- Insert into `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为
//一、先插入主表数据 Insert into [sqlserver订单表] ([订单编号],[订单名称],[订单状态]) values
(@订单编号,@订单名称,@订单状态); //二、获取主表的ID
declare @主ID int = @@identity; //三、解析传过来的子表数据,批量插入到主表中
INSERT INTO [sqlserver订单详情表] (
[订单ID], [物品] ,[数量] , [备注]
)
SELECT
@主ID, x.[id], x.[num], x.[note]
FROM OPENJSON(@订单子表) WITH (
id int N'$.ID',
num int N'$.num',
note nvarchar(100) N'$.note'
)as x
这个SQL中,MVP就是OPENJSON这个函数,原理替大家百度了一下
sqlserver通过OPENJSON转换 json数据_sqlserver openjson_slilx的博客-CSDN博客
大家在使用的时候,注意下自己数据库的版本是否支持这两个函数,
demo给呈上,仅供参考,外联库大家不一定能运行
外联库批量添加主子表数据.fgcc
(703.71 KB, 下载次数: 525)
|
|