mysql保存测试数据_Mysql自动填充测试数据
前言
最近写了两个小脚本,一个应用于Mysql的自动填充测试数据,另外一个是bash写的定期删除日志文件,两个脚本如何使用,在GitHub上面都有所说明,这里不再赘述,这里主要是想聊一下Mysql的存储过程以及自动填充测试数据。
为什么要写一个自动填充测试数据的脚本?
网上其实也有一些简单的给Mysql填充数据的博客,但是大多数都是针对于特定的表的特定数据来实现,写的过于简单,实用性不强,而这个脚本可以根据我们提供表的字段,来自动识别我们的字段并填充进入对应的内容,常用的结构都能够满足,当然还有进一步完善的空间。
存储过程
Mysql的存储过程可以帮助我们实现一些较为复杂的业务逻辑,就像我们在PHP或者其他语言中所写的逻辑一样,在Mysql中也同样可以执行,比如我们要循环写入1000行数据。
不过虽然Mysql可以实现,但是我们更希望把业务逻辑建立在我们的业务语言上面,而Mysql则专注于处理数据的CURD,其主要原因在于我们今后在修改或者要查找到这块的业务逻辑时,会相对麻烦一些。
因此,我更倾向于Mysql可以用来做一些与我们的业务逻辑无关,而又需要用到语言的逻辑性的项目,比如我在前面提到的自动填充数据。
形式
delimiter $$
drop procedure if exists test $$
create procedure test()
begin
-- do something
end $$
delimiter ;
这是一个自动识别表结构并填充数据的脚本,在第一行使用了delimiter $$用作分隔符,因为接下来的脚本里面很多地方会使用到;,所以为防止过早的识别结束,暂时修改了Mysql默认的分隔符。
此外,前面有begin和end包裹,用于识别开始和结束。
暂时先不讲逻辑怎么实现的(其实逻辑也非常简单),我们先来了解一下Mysql的存储过程的几个部分。
注:通过show create procedure your_procedure_name可以查看创建的存储过程的代码内容。
变量
Mysql的变量分成三种:全局变量,用户变量,局部变量。
局部变量
局部变量存在于我们的存储过程中,在外面无法访问:
delimiter $$
drop procedure if exists test $$
create procedure test()
begin
declare myName varchar(8) default 'seven';
set myName = 'nine';
select myName;
end $$
delimiter ;
call test();
结果输出nine,因为在用户变量中需要@来声明,所以此时在外面无法使用select myName,否则报错。
用户变量
用户变量存在于全局,但是有效期仅限于会话期(所以也可以叫做会话变量),即我们下次打开Mysql时,变量就会消失:
delimiter $$
drop procedure if exists test $$
create procedure test()
begin
set @myName = 'nine';
end $$
delimiter ;
call test();
select @myName ;
输出nine。
当然,赋值的形式是多样的,我们也可以结合查询语句来赋值:
select name, age from user limit 1 into @myName , @myAge;
select @myName , @myAge;
这个时候赋值的内容就是我们表中的数据,这里需要注意的是一一对应关系,切不可一对多或者多对一。
在某些时候,我们可能需要对查询的次数进行记录,其实这个时候我们可以完全使用变量来帮我们实现:
set @selectNum = 0;
select * , @selectNum := @selectNum + 1 from user limit 1;
这个时候@selectNum的结果为2。
全局变量
全局变量是设置在系统中的配置,我们可以通过show global variables来查看,也可以通过set global oneofvariable=value来设置我们已经存在的配置,这里我特意给已经存在这几个字眼加粗,因为我在网上看到有博文说可以设置自定义的全局变量,但是我尝试了之后发现报错了,我用版本5.5和5.7都尝试过了,提示这个变量不存在。
参数
参数分成IN,OUT以及INOUT三种情况:
其实从其字面上我们也能猜出他们的不同效果:IN是不会影响外面设置的结果(IN是默认方式),OUT和INOUT是会影响到的,同时INOUT两边是相互影响的,我们还是以上面的test为例:
in
set @num = 1;
delimiter $$
drop procedure if exists test $$
create procedure test(num int)
begin
set num = 2;
end $$
delimiter ;
call test(@num);
select @num;
结果为1。
out
set @num = 1;
delimiter $$
drop procedure if exists test $$
create procedure test(OUT num int)
begin
set num = 2;
end $$
delimiter ;
call test(@num);
select @num;
结果为2。
语句块
这篇文章关于语句块已经阐述的足够详细,这里不再赘述。
实现
代码:
delimiter $$
drop procedure if exists fillTable $$
create procedure fillTable(in num int , in tbName varchar(16))
begin
-- 获取当前数据库
select (@dbName:=database());
set @tbName = tbName;
-- 获取表的字段总数
set @currSql = "select count(1) from information_schema.COLUMNS where table_name = ? and table_schema = ? into @columnSum";
prepare stmt from @currSql;
execute stmt using @tbName , @dbName;
deallocate prepare stmt;
set @currNum = 0;
-- 这里设置随机的字符串
set @chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
while @currNum < num do
-- 这里设置sql后面拼接
set @insertSql = concat("insert into " , @tbName , " values ( ");
set @columnNum = 1;
while @columnNum <= @columnSum do
set @value := '';
set @currSql = "select (@column := COLUMN_NAME) , (@length := CHARACTER_MAXIMUM_LENGTH) , (@key := COLUMN_KEY) , (@type := DATA_TYPE) from information_schema.COLUMNS where table_name = ? and table_schema = ? limit ?";
prepare stmt from @currSql;
execute stmt using @tbName , @dbName , @columnNum;
deallocate prepare stmt;
-- 根据类型来填充数据
if right(@type , 3) = 'int' then
if @type = 'int' then
set @value = 'default';
else
set @value = floor(rand() * 100);
end if;
elseif right(@type , 4) = 'char' then
set @counter = 0;
while @counter < @length do
set @value = concat(@value,substr(@chars,ceil(rand()*(length(@chars)-1)),1));
set @counter = @counter + 1;
end while;
set @value = concat("'" , @value , "'");
elseif @type = 'blob' or right(@type , 4) = 'text' then
set @counter = 0;
while @counter < 100 do
set @value = concat(@value,substr(@chars,ceil(rand()*(length(@chars)-1)),1));
set @counter = @counter + 1;
end while;
set @value = concat("'" , @value , "'");
elseif @type = 'float' or @type = 'decimal' then
set @value = round(rand() , 2);
else
set @value = 'nine';
end if;
-- 判断这个数是否是最后一个
if @columnNum = @columnSum then
set @insertSql = concat(@insertSql , @value , ' )');
else
set @insertSql = concat(@insertSql , @value , ' , ');
end if;
set @columnNum = @columnNum + 1;
end while;
-- 执行
prepare stmt from @insertSql;
execute stmt;
deallocate prepare stmt;
set @currNum = @currNum + 1;
end while;
end $$
delimiter ;
其实实现这个功能的逻辑非常简单,再各个步骤里面也附上了步骤,主要是利用了系统的information_schema.COLUMNS表来获取我们需要的一些基本信息,主要结构如下图所示:
参考
mysql保存测试数据_Mysql自动填充测试数据相关推荐
- mysql自动填充_Mysql自动填充测试数据
前言 最近写了两个小脚本,一个应用于Mysql的自动填充测试数据,另外一个是bash写的定期删除日志文件,两个脚本如何使用,在GitHub上面都有所说明,这里不再赘述,这里主要是想聊一下Mysql的存 ...
- 浏览器保存密码后自动填充问题
问题描述 在浏览器中进行登录操作时浏览器往往会问我们是否需要记住密码,当我们点击了记住密码后,发现浏览器会自动填充此域名下已经保存的账号密码,给用户带来不便.加了HTML5 中的新属性autocomp ...
- php的seeder是什么,【laravel5.1-0.0.6】Seeder自动填充测试数据
1.Seeder是什么? 是个数据填充器工具: laravel自带database/seeds/DatabaseSeeder.php类: 文件将通过命令生成在 database/seeds/下: 2. ...
- Seeder自动填充测试数据
1.Seeder是什么? 是个数据填充器工具: laravel自带database/seeds/DatabaseSeeder.php类: 文件将通过命令生成在 database/seeds/下: 2. ...
- mysql 手工修复_MySQL自动备份和手工恢复
欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 以下是windows下的批处理: 1set hour_str=%time:~0,2% 2if "%hour_st ...
- mysql生成序列_mysql 自动生成编号函数
根据需求,保存表数据时需要自动生成一个编号,格式如:AA-2020-03-31-0001 (AA-yyyy-MM-dd-序号).数据库用的mysql,所以创建一个mysql函数. 1.建表: cre ...
- mysql的自动编码_mysql 自动生成编号函数
根据需求,保存表数据时需要自动生成一个编号,格式如:AA-2020-03-31-0001 (AA-yyyy-MM-dd-序号).数据库用的mysql,所以创建一个mysql函数. 1.建表: cre ...
- mysql重连_mysql自动重连
最近部署一个系统,后台用线程池来处理请求,而每个线程有一个mysql连接.当系统运行一阶段后,有些请求会出现操作"Internal error",而操作一次可能又会成功.经过多方调 ...
- mysql 备份 发送邮件_mysql 自动备份发邮件 到指定邮箱
首先 编写 导出的 命令 使用了 mysqladmin ping mysqldump 然后是 添加附件到邮件中发送 使用了对应的com 最后 暂停 看情况 参考: 见程序: @echo on :: m ...
最新文章
- CRF和HMM区别不仅仅前者是判别模型后者是生成模型
- 【PP生产订单】入门介绍(五)
- 计算机要怎么设置才能谈音乐,解读:如何设置要插入计算机的U盘以自动播放歌曲...
- keytool命令总结
- JDK 10:从Java访问Java应用程序的进程ID
- RSA 非对称加密原理
- mysql的条件语句_mysql条件语句
- ArcGIS案例学习笔记_3_2_CAD数据导入建库
- Mybatis参数Integer类型值为0 源码处理
- 计算机软件著作权的保护范围,计算机软件的著作权保护范围分析
- paip.表格化CSV输出
- html5酷狗音乐网页代码,酷狗音乐
- hive 计算周几_HIVE 计算指定日期本周的第一天和最后一天
- markdown的标题设置自动添加序号
- MySQL INSERT对表中数据的操作-插入数据
- CSDN官方积分方法
- 入门大数据就业前景怎么样?
- b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释
- Android Dialog
- 华为OD机试 - 高矮个子排队