mysql存储过程实现同时多表写入,构造创建商品数据

2023-05-16

前言
通常在做性能测试的过程中,我们需要构造一下性能测试数据,有些可以通过调用API,直接构造数据,但是可能会存在一些场景,需要我们直接在数据库中插入数据,通常我们对于一些较为见到的场景,可以直接循环插入一张表中,但是如果我们遇到一些场景,比如创建商品,可能会设计到同时插入多张表,那么我们如何实现呢?
数据库表设计
下面我们以电商的项目为例,通过数据库实现插入商品数据,那么在创建商品数据之前,我们来了解一下表结构,在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以看到三张表,分别是商品表、产品表和库存表,我们在创建商品的时候,需要分别在这三张表中插入数据。那么我们可以看到es_product产品表中需要依赖es_good表中的goods_id;
而库存表es_product_store表中依赖goods_id 和 productid。

那么mysql如果合适每次插入的时候,都处理数据依赖呢?这里我们可以使用mysql的存储过程。

mysql存储过程

首先,我们创建一个函数,在函数中定义我们脚本需要的变量。首先我们需要了解业务需求,居然是创建商品,那么商品名称、编号通常都是唯一的,所以我们将这个数据定义成一个变量,后期做参数化。

BEGIN
		DECLARE i INT DEFAULT 0;
		DECLARE goods_name VARCHAR(20);  -- 商品名称
		DECLARE goods_sn VARCHAR(20);    -- 商品编号
END

在写脚本之前,我们来思考,每个商品都有自己品牌id和类目id,这个id我们可以每个商品都设置成相同的吗?答案是最好不要,因为我们线上的系统可能会做分布式,如果说我们每个商品都设置相同的类目,可能这些数据都会到同一台机上,那么我们压测的过程中,可能会一直压测一台机器。

那么通常我们品牌id都是数据库自增的,像我们的数据库里面一共有95个品牌,那么我是不是可以写脚本,将品牌id设置成在1-95这个数字之间随机。下面是随机生成1-95之间的脚本。

/*随机生成品牌ID,目前平台现有品牌ID,有1-95*/
SET brands_id = FLOOR(RAND()*(95-1) + 1);

那么我们来看一下如何编辑插入商品表的脚本,这里只是一个简单的sql脚本,响应学过编程的朋友,这里理解起来不难。

BEGIN
		DECLARE i INT DEFAULT 0;
		DECLARE goods_name VARCHAR(20);  -- 商品名称
		DECLARE goods_sn VARCHAR(20);    -- 商品编号
		DECLARE good_id INT;             -- 商品id
		DECLARE product_id INT;          -- 产品id
		DECLARE brands_id INT;           -- 品牌id
		DECLARE cats_id INT;             -- 类目id
		

		
		/*循环构造商品数据*/
		WHILE i < 1 DO
		  
			/*通过字符串拼接,循环构造商品名称,如test_1*/
			SET goods_name = CONCAT('test_', i);
			
			/*构造订单号*/
			SET goods_sn = CONCAT('SN202108120000', i);
			
			/*随机生成品牌ID,目前平台现有品牌ID,有1-95*/
			SET brands_id = FLOOR(RAND()*(95-1) + 1);
			
			/*类目id,1-93*/
			SET cats_id = FLOOR(RAND()*(93-1) + 1);

			/*商品表*/
			INSERT INTO es_goods (
				NAME,
				sn,
				brand_id,
				cat_id,
				type_id,
				goods_type,
				weight,
				market_enable,
				intro,
				price,
				cost,
				mktprice,
				params,
				disabled,
				store,
				page_title,
				meta_keywords,
				meta_description,
				p1,
				p2,
				p3,
				thumbnail,
				big,
				small,
				original 
			)
			VALUES
				(
					goods_name,
					goods_sn,
					brands_id,
					cats_id,
					45,
					'normal',
					0.00,
					1,
					'<p>我爱金士顿333</p>',
					9.9,
					9.9,
					9.9,
					'[{"name":"基本信息","paramList":[{"name":"商品尺寸","value":"5.7 x 1.7 x 1 cm ","valueList":[]},{"name":"商品重量","value":"18g","valueList":[]}],"paramNum":2}]',
					0,
					100,
					'金士顿3',
					'金士顿3',
					'金士顿3',
					1,
					1,
					1,
					'https://oss-fg.feng-go.com/assets/pic/2021/07/23ed225b6c90514054bdcd242d8321da01.jpg',
					'https://oss-fg.feng-go.com/assets/pic/2021/07/23ed225b6c90514054bdcd242d8321da01.jpg',
					'https://oss-fg.feng-go.com/assets/pic/2021/07/23ed225b6c90514054bdcd242d8321da01.jpg',
					'https://oss-fg.feng-go.com/assets/pic/2021/07/23ed225b6c90514054bdcd242d8321da01.jpg' 
				);
				
				
				SET i = i + 1;
		END WHILE;
		
	


END

那么我们实现了商品表的插入,如何获取到商品表的goods_id呢?mysql提供了一个函数,last_insert_id();这个函数可以获取到上一条插入sql的id,那这样我们产品表和库存表是不是就可以实现了呢?

SET product_id = last_insert_id();

下面我们来看看如何实现多表同时写入数据:

BEGIN
		DECLARE i INT DEFAULT 0;
		DECLARE goods_name VARCHAR(20);  -- 商品名称
		DECLARE goods_sn VARCHAR(20);    -- 商品编号
		DECLARE good_id INT;             -- 商品id
		DECLARE product_id INT;          -- 产品id
		DECLARE brands_id INT;           -- 品牌id
		DECLARE cats_id INT;             -- 类目id
		
		/*循环构造商品数据*/
		WHILE i < 1 DO
		  
			/*通过字符串拼接,循环构造商品名称,如test_1*/
			SET goods_name = CONCAT('test_', i);
			
			/*构造订单号*/
			SET goods_sn = CONCAT('SN202108120000', i);
			
			/*随机生成品牌ID,目前平台现有品牌ID,有1-95*/
			SET brands_id = FLOOR(RAND()*(95-1) + 1);
			
			/*类目id,1-93*/
			SET cats_id = FLOOR(RAND()*(93-1) + 1);

			/*商品表*/
			INSERT INTO es_goods (
				NAME,
				sn,
				brand_id,
				cat_id,
				type_id,
				goods_type,
				weight,
				market_enable,
				intro,
				price,
				cost,
				mktprice,
				params,
				disabled,
				store,
				page_title,
				meta_keywords,
				meta_description,
				p1,
				p2,
				p3,
				thumbnail,
				big,
				small,
				original 
			)
			VALUES
				(
					goods_name,
					goods_sn,
					brands_id,
					cats_id,
					45,
					'normal',
					0.00,
					1,
					'<p>我爱金士顿333</p>',
					9.9,
					9.9,
					9.9,
					'[{"name":"基本信息","paramList":[{"name":"商品尺寸","value":"5.7 x 1.7 x 1 cm ","valueList":[]},{"name":"商品重量","value":"18g","valueList":[]}],"paramNum":2}]',
					0,
					100,
					'金士顿3',
					'金士顿3',
					'金士顿3',
					1,
					1,
					1,
					'https://oss-fg.feng-go.com/assets/pic/2021/07/23ed225b6c90514054bdcd242d8321da01.jpg',
					'https://oss-fg.feng-go.com/assets/pic/2021/07/23ed225b6c90514054bdcd242d8321da01.jpg',
					'https://oss-fg.feng-go.com/assets/pic/2021/07/23ed225b6c90514054bdcd242d8321da01.jpg',
					'https://oss-fg.feng-go.com/assets/pic/2021/07/23ed225b6c90514054bdcd242d8321da01.jpg' 
				);
				
			/*获取上一条插入商品表的自增id*/
		  SET good_id = last_insert_id();
			
			
			/*插入产品表数据,goods_id从上一条sql中获取自增id*/
			INSERT INTO es_product ( goods_id, NAME, sn, store, price, specs, cost, weight )
			VALUES
				(
					good_id,
					goods_name,
					goods_sn,
					100,
					9.9,
					'白色、L',
					9.9,
					0.00 
				);
				
			/*获取产品表中的自增id*/	
			SET product_id = last_insert_id();
			
			
			INSERT INTO es_product_store ( goodsid, productid, depotid, store )
			VALUES
				(
					good_id,
					product_id,
					1,
				100);
				
				SET i = i + 1;
		END WHILE;
		
	

END

一个简单的创建商品sql就实现啦~我们来看看数据库插入的数据:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql存储过程实现同时多表写入,构造创建商品数据 的相关文章

  • ONOS-ifwd-app源码分析总结

    ONOS ifwd源码分析 xff0c 参考资料 xff1a https www sdnlab com 10297 html 在之前的文章中 xff0c 介绍了ONOS sample apps的获取 xff0c 但是将其生成的oar文件导入
  • YOLO系列

    仅供个人记录学习 yolo总结 RCNN二阶段算法 xff0c 需要先用算法在图片上生成样本候选框 xff0c 然后再对这些框进行分类 yolo一阶段算法 xff0c 不需要生成候选框 xff0c 直接在样本上计算出框的坐标与大小 xff0
  • 错误总结(配置安装Prometheus,启动./prometheus)

    前提 xff1a 下载的操作系统版本要对应 xff0c 不然就会出现二进制文件无法执行 xff01 xff01 xff01 xff01 xff01 xff01 xff01 1 Prometheus配置文档prometheus yml 配置内
  • kali-linux基础命令

    文件与目录操作命令 touch 命令用于创建空白文件与修改文件时间 xff0c 格式为 xff1a touch 选项 文件 cp 命令用于复制文件或目录 xff0c 格式为 xff1a cp 选项 源文件 目标文件 mv 命令用于移动文件或
  • 我,程序员,想做人工智能,可现实劝我回头是岸!

    最近不少准备入行人工智能的粉丝向我吐槽 xff1a 1 人工智能怎么入行 xff1f 应用方向那么多 xff0c 哪个才是最适合自己的 xff1f 2 看了不少人工智能课程 xff0c 但门槛都太高了 xff0c 真正零基础的课程少之又少
  • 如何将Pyecharts绘制的 "地图" 展示在百度地图中?

    人生苦短 xff0c 快学Python xff01 Pyecharts绘图的确很棒 xff0c 尤其是地图 xff0c 那么将你的数据指标 xff0c 展示在百度地图中 xff0c 有时怎么样的一种感觉 xff1f 其实Pyecharts绘
  • 爬虫到底违法吗?这位爬虫工程师给出了答案

    作者 猪哥 来源 裸睡的猪 xff08 ID xff1a IT Pig xff09 一 自述 1 关于大学 我读的大学是个野鸡学校 xff0c 虽说是一个计算机专业 xff0c 但实际的课程内容很杂 CAD 3DMAX Office全家桶之
  • 开发者,你真正关心的问题是什么?| AI ProCon 2019

    2018 年 xff0c 上千名开发者与上百名技术专家齐聚一堂 xff0c 在 CSDN 2018 AI开发者大会上以 AI技术与应用 为核心 xff0c 深度聚焦人工智能的技术创新与行业应用 xff0c 真正做到了 只讲技术 xff0c
  • JETSON XAVIER NX入门教程(一)基础设置和安装

    1 Intro jetson xxx系列 作为nvidia公司的AIOT产品 作用非常强大 生态也是很活跃 确实是可以入门的极好产品 此处省去几万字 2 Basic install 2 1镜像烧录 就是下载不对型号设备的镜像 官网链接 然后
  • Nvidia Jetson nano 插卡插hdmi和电源无法开机显示器黑屏jetsonnano重置系统恢复

    Ensure smooth network 确保网络畅通 下载包 进下载页面下载对应NVIDIA SDK Manager NVIDIA Developer Upload deb to ubuntu vm 上传包 Install deb 安装
  • 激光雷达目标检测 (上)

    激光雷达目标检测 xff08 上 xff09 转载自美团无人专送团队 简介 安全性是自动驾驶中人们最关注的问题之一 在算法层面 xff0c 无人车对周围环境的准确感知是保证安全的基础 xff0c 因此感知算法的精度十分重要 现有感知算法的思
  • apt更换镜像源

    文章转载至 荒野雄兵的博客 https blog csdn net daerzei article details 84873964 系统说明 xff1a VMware14 Pro下Ubuntu18 04 LTS版 xff0c 64位 网上
  • 绝不拖延(转)

    我要立即行动 绝不拖延 从今天起 无论做什么事情 我要立即行动 绝不拖延 拖延是造成人世一切悲剧根源 xff0c 我要竭力避免拖延 如同逃避罪恶的引诱 曾经 我有多少美好的憧憬 我多少远大的理想 我多少切实的计划 因为拖延 而被冲刷得一干二
  • mt7601u linux驱动编译,移植MT7601U AP Linux 驱动至Orangepi-PC2开发板

    简单一下记录移植MT7601U AP Linux 驱动至Orangepi PC2开发板的过程 二 环境描述 1 Orangpi PC2开发板 Linux Orangepi 3 10 65 12 SMP PREEMPT Sat Mar 4 1
  • 黑群晖docker清理缓存_Docker容器日志查看与清理(亲测有效)

    1 问题 docker容器日志导致主机磁盘空间满了 docker logs f container name噼里啪啦一大堆 xff0c 很占用空间 xff0c 不用的日志可以清理掉了 2 解决方法 2 1 找出Docker容器日志 在lin
  • 配置华为s系列交换机mode lacp

    以S5700为例 xff1a 1 创建eth trunk 1 xff0c 并配置成LACP模式 lt Quiway gt system view Quiway sysname SwitchA SwitchA interface Eth Tr
  • 使用 KubeSphere 快速部署 Chaos Mesh

    Chaos Mesh 简介 Chaos Mesh 是一个开源的云原生混沌工程平台 xff0c 提供丰富的故障模拟类型 xff0c 具有强大的故障场景编排能力 xff0c 方便用户在开发测试中以及生产环境中模拟现实世界中可能出现的各类异常 x
  • phpstorm 2018破解版 2018.2下载安装和JetbrainsCrack.jar激活教程

    一 下载phpstrom破解版http www sdbeta com wg 2018 0330 221278 html 二 双击PhpStorm 2018 1 exe运行 xff0c 开始安装 xff0c 进入安装向导 xff0c 点击ne
  • 操作mysql_MySQL:MySQL的基本操作

    那么如果我只想要数据 xff0c 而不想要什么sql命令时 xff0c 应该如何操作呢 xff1f 可将查询存储在一个文件中并告诉mysql从文件中读取查询而不是等待键盘输入 可利用外壳程序键入重定向实用程序来完成这项工作 例如 xff0c
  • winscp 配置(详细)

    winscp 配置 xff08 详细 xff09 问题起因 想在A电脑上直接访问到B电脑的文件 xff0c 不用中间拷来拷去的 xff0c 太麻烦 所以就下载了winscp这个软件 但是在使用时出现了一些问题 xff0c 好在最终都解决了

随机推荐