今天老大叫我用存储过程创建测试数据,然后我东拼西凑,终于可以用存储过程创建测试数据,第一次发现SQL编程的魅力。以下来描述测试数据创建过程。
一、准备2张表(user表和dept表)
二、准备基础知识
临时变量、局部变量、游标、循环、嵌套循环等使用。请参考我在最后列出的参考文档。
三、准备部门表数据
四、存储引擎编写如下
DELIMITER //
CREATE PROCEDURE mockDataCreate(IN dataCount INT) -- dataCount各个部门人数
BEGIN
DECLARE _deptno INT; -- 部门ID
DECLARE done INT; -- 完成标记
DECLARE initCount INT; -- 初始标记
DECLARE dept_cursor CURSOR FOR SELECT id FROM dept; -- 定义游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 定义记录结束后游标触发操作
SET done = 0;
SET initCount = 1;
OPEN dept_cursor; -- 打开游标
dept_cursor_loop:LOOP -- 定义循环
FETCH dept_cursor INTO _deptno; -- 使用游标获取数据到指定局部变量
IF done = 1 THEN -- 游标走到末尾,done会自动被设置为1,此时会执行此句
LEAVE dept_cursor_loop; -- 跳出循环
END IF;
data_count_loop:LOOP -- 每个部门插入人数循环
IF initCount > dataCount THEN
LEAVE data_count_loop;
END IF;
INSERT INTO user(name, deptno) VALUES(CONCAT('用户', initCount), _deptno);
SET initCount = initCount + 1;
END LOOP;
SET initCount = 1;
END LOOP;
END //
DELIMITER ;
插入6W数据,执行大概用了100S,感觉很慢。不知道是不是因为每次都进行了SQL的解析、单条插入导致的。
是不是很香?哈哈,再也不用写Java代码插入数据了,还能创造有关联的数据。
然后,我在执行前,一直担心执行了存储过程,万一终止条件没设置好,导致一直创建数据咋办,于是也百度了有些关于停止MYSQL线程的语句。
show procedure status; -- 查询所有存储过程状态
show create procedure proc_name; -- 查询存储过程创建
show create function func_name; -- 查询函数创建
SHOW PROCESSLIST; -- 查询当前运行的MYSQL线程
KILL 线程ID; -- 终止ID为此ID的MYSQL线程
DROP PROCEDURE [ IF EXISTS ] <过程名> -- 删除存储过程
参考文档: