找回密码
 立即注册

QQ登录

只需一步,快速开始

Joe.xu 讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2023-6-8 18:39  /   查看:3312  /  回复:1
本帖最后由 Joe.xu 于 2024-12-16 15:20 编辑

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

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


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

image.png325417479.png

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

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


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

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

复制代码


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

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

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)

1 个回复

倒序浏览
willning
超级版主   /  发表于:2023-6-15 09:14:59
沙发
补充一下这两个语法的最低版本
JSON_TABLE: MySQL 8.0
OPENJSON:SQL Server 2016,或者数据库COMPATIBILITY_LEVEL不小于130的更新版本
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部