在 MySQL 中,存在函数和存储过程,他们两种相似又有些不同,函数有返回值而存储过程没有返回值。
当我们有批量插入数据的需求时,可以使用函数+存储过程完成插入数据的随机性,下面写一个小demo,模拟两张表,插入1000条随机数据。
创建两张表,一张部门表,一张员工表。
函数
接下来我们写两个函数,一个生成随机字符串,一个生成随机数字。
这里要说一下的是,我们通过
DELIMITER $$
把 mysql 原本的结束符改成了 $$,是为了防止多行被默认的 ;结束符提交。
DELIMITER $$
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
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 $$
CREATE FUNCTION rand_num() RETURNS INT(5)
BEGIN
DECLARE i INT DEFAULT 0;
SET i = FLOOR(0 + RAND()*10);
RETURN i;
END $$
存储过程
编写批量插入 emp 表数据的存储过程
DELIMITER $$
CREATE PROCEDURE insert_emp(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 emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES((START + i), rand_string(6), 'SALE', 001, CURDATE(), 1000, 500, rand_num());
UNTIL i = max_num
END REPEAT;
COMMIT;
END $$
编写批量插入 dept 表数据的存储过程
DELIMITER $$
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 dept(deptno, dname, loc) VALUES((START + i), rand_string(6), rand_string(8));
UNTIL i = max_num
END REPEAT;
COMMIT;
END $$
接 下 来 就 只 要 调 用 存 储 过 程 就 o k 啦 ! ! 接下来就只要调用存储过程就ok啦!! 接下来就只要调用存储过程就ok啦!!
DELIMITER ;
CALL insert_dept(1,10);
DELIMITER ;
CALL insert_emp(1,1000);