Mysql 自定义函数和存储过程自动批量生产数据脚本

随机时间函数:

复制代码
DELIMITER $ 
DROP FUNCTION IF EXISTS rand_time;
CREATE FUNCTION rand_time(startTime datetime, endTime datetime) RETURNS datetime
BEGIN
    DECLARE ms int;
		DECLARE resultTime datetime;
		SET ms = DATEDIFF(endTime,startTime);
		SET resultTime = DATE_ADD(startTime, interval Floor(ms*rand()*5/8) day);
		RETURN resultTime;
END $
DELIMITER;

随机数函数:

复制代码
DELIMITER $ 
DROP FUNCTION if EXISTS rand_num;
CREATE FUNCTION rand_num() RETURNS INT(5)
BEGIN
    DECLARE i INT DEFAULT 0;
    SET i = FLOOR(100+RAND()*10);
    RETURN i;
END $
DELIMITER;

随机字符串函数

复制代码
DELIMITER $ 
DROP FUNCTION if EXISTS rand_string;
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
    DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmlopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    DECLARE return_str VARCHAR(255) DEFAULT '';
    DECLARE i INT DEFAULT 0;
    WHILE i < n DO
    SET return_str = CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
    SET i = i+1;
    END WHILE;
    RETURN return_str;
END $
DELIMITER;
实战案例:

表结构:

复制代码
-- 创建两个表:员工表和部门表
-- 部门表,存在则进行删除
drop table if EXISTS dep;
create table dep(
    id int unsigned primary key auto_increment,
    depno mediumint unsigned not null default 0,
    depname varchar(20) not null default "",
    memo varchar(200) not null default ""
);

-- 员工表,存在则进行删除
drop table if EXISTS emp;
create table emp(
    id int unsigned primary key auto_increment,
    empno mediumint unsigned not null default 0,
    empname varchar(20) not null default "",
    job varchar(9) not null default "",
    mgr mediumint unsigned not null default 0,
    hiredate datetime not null,
    sal decimal(7,2) not null,
    comn decimal(7,2) not null,
    depno mediumint unsigned not null default 0
);

注意说明
-- mediumint是MySQL数据库中的一种整型,比INT小,比SMALLINT大,
-- 取值范围为:-8388608到8388607,无符号的范围是0到16777215。
-- 中等大小的整数,一位大小为3个字节。

编写存储过程,模拟 6000000的员工数据

复制代码
-- 编写存储过程,模拟 100W 的员工数据。
-- 建立存储过程:往emp表中插入数据
 DELIMITER $
 drop PROCEDURE if EXISTS insert_emp;
 CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
 BEGIN
     DECLARE i INT DEFAULT 0;
     /*set autocommit =0 把autocommit设置成0,把默认提交关闭*/
     SET autocommit = 0;
     REPEAT
     SET i = i + 1;
     INSERT INTO emp(empno,empname,job,mgr,hiredate,sal,comn,depno) VALUES ((START+i),rand_string(6),'SALEMAN',0001,now(),2000,400,rand_num());
     UNTIL i = max_num
     END REPEAT;
     COMMIT;
 END $
 DELIMITER;
 
-- 插入600W条数据,时间有点久,耐心等待
 call insert_emp(0,6000000);

-- 查询部门员工表
select * from emp LIMIT 1,10;

编写存储过程,模拟 120 的部门数据

复制代码
-- 编写存储过程,模拟 120 的部门数据
-- 建立存储过程:往dep表中插入数据
 DELIMITER $
 drop PROCEDURE if EXISTS insert_dept;
 CREATE PROCEDURE insert_dept(IN START INT(10),IN max_num INT(10))
 BEGIN
     DECLARE i INT DEFAULT 0;
     SET autocommit = 0;
     REPEAT
     SET i = i+1;
     INSERT  INTO dep( depno,depname,memo) VALUES((START+i),rand_string(10),rand_string(8));
     UNTIL i = max_num
     END REPEAT;
     COMMIT;
 END $
 DELIMITER;
 
-- 插入120条数据
 call insert_dept(1,120);

-- 查询部门员工表
select * from dep;

备份表结构和数据:

复制代码
备份表结构和数据
方法一:SELECT * INTO ims_stock_quantity_balance_bak FROM ims_stock_quantity_balance; 
报错Undeclared variable可以使用方法二
方法二:create table ims_stock_quantity_balance_bak (select * from ims_stock_quantity_balance);

从一个表中复制所有的列插入到另一个已存在的表中
INSERT INTO ims_stock_quantity_balance_bak SELECT * FROM ims_stock_quantity_balance;

总结:
select into from 和 insert into select都是用来复制表,两者的主要区别为: 
  select into from 要求目标表不存在,因为在插入时会自动创建。
  insert into select from 要求目标表存在。
相关推荐
小乌龟不会飞19 分钟前
Ubuntu 安装 etcd 与 etcd-cpp-apiv3
数据库·etcd
程序员岳焱7 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
计算机毕设定制辅导-无忧学长8 小时前
西门子 PLC 与 Modbus 集成:S7-1500 RTU/TCP 配置指南(一)
服务器·数据库·tcp/ip
雨白8 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
程序员柳8 小时前
基于微信小程序的校园二手交易平台、微信小程序校园二手商城源代码+数据库+使用说明,layui+微信小程序+Spring Boot
数据库·微信小程序·layui
梦在深巷、9 小时前
MySQL/MariaDB数据库主从复制之基于二进制日志的方式
linux·数据库·mysql·mariadb
IT乌鸦坐飞机9 小时前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7
IT_10249 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
Johny_Zhao10 小时前
Ubuntu系统安装部署Pandawiki智能知识库
linux·mysql·网络安全·信息安全·云计算·shell·yum源·系统运维·itsm·pandawiki
kk爱闹10 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python