什么是存储过程,如何创建一个存储过程
存储过程的英文是 Stored Procedure,它的思想很简单,就是 SQL 语句的封装;
一旦存储过程被创建出来,使用它就像使用函数一样简单;
我们直接通过调用存储过程名即可,存储过程实际上由 SQL 语句和流控制语句共同组成。
CREATE PROCEDURE 存储过程名称 ([参数列表]) BEGIN 需要执行的语句 END ---使用储存过程 CALL 存储过程名称 ([参数列表]);
使用Mysql的储存过程,新增100W条数据
--创建表 CREATE TABLE `user`(`user_id` INT UNSIGNED AUTO_INCREMENT,`user_name` VARCHAR(40) NOT NULL,`create_time` DATETIME, PRIMARY KEY ( `user_id` ))ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 创建存储过程+事务 CREATE PROCEDURE `insert_user` (IN START INT(10), IN max_num INT(10)) BEGIN DECLARE i INT DEFAULT 0; DECLARE date_start DATETIME DEFAULT ('2021-01-16 00:00:00'); DECLARE date_temp DATETIME; SET date_temp = date_start; --关闭自动提交 SET autocommit=0; REPEAT SET i=i+1; SET date_temp = date_add(date_temp, interval RAND()*60 second); INSERT INTO user(user_id, user_name, create_time) VALUES((start+i), CONCAT('user_',i), date_temp); UNTIL i = max_num END REPEAT; COMMIT; END --插入数据 CALL insert_user(10000,1000000);
用 date_start 变量来定义初始的注册时间,时间为 2021 年 1 月 16 日 0 点 0 分 0 秒,然后用 date_temp 变量计算每个用户的注册时间,新的注册用户与上一个用户注册的时间间隔为 60 秒内的随机值。然后使用 REPEAT … UNTIL … END REPEAT 循环,对 max_num 个用户的数据进行计算;
在循环前,将 autocommit 设置为 0,这样等计算完成再统一插入,执行效率更高。
注意:
如果你使用 Navicat 这个工具来管理 MySQL 执行存储过程,那么直接执行上面这段代码就可以了;
如果用的是 MySQL,你还需要用 DELIMITER 来临时定义新的结束符;
因为默认情况下 SQL 采用(;)作为结束符,这样当存储过程中的每一句 SQL 结束之后,采用(;)作为结束符,就相当于告诉 SQL 可以执行这一句了;
但是存储过程是一个整体,我们不希望 SQL 逐条执行,而是采用存储过程整段执行的方式,因此我们就需要临时定义新的 DELIMITER,新的结束符可以用(//)或者($$);
如果你用的是 MySQL(指的客户端),那么上面这段代码,应该写成下面这样:
--创建表 CREATE TABLE `user`(`user_id` INT UNSIGNED AUTO_INCREMENT,`user_name` VARCHAR(40) NOT NULL,`create_time` DATETIME, PRIMARY KEY ( `user_id` ))ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 创建存储过程+事务 DELIMITER $$ CREATE PROCEDURE `insert_user` (IN START INT(10), IN max_num INT(10)) BEGIN DECLARE i INT DEFAULT 0; DECLARE date_start DATETIME DEFAULT ('2021-01-16 00:00:00'); DECLARE date_temp DATETIME; SET date_temp = date_start; --关闭自动提交 SET autocommit=0; REPEAT SET i=i+1; SET date_temp = date_add(date_temp, interval RAND()*60 second); INSERT INTO user(user_id, user_name, create_time) VALUES((start+i), CONCAT('user_',i), date_temp); UNTIL i = max_num END REPEAT; COMMIT; END $$ DELIMITER ; --插入数据 CALL insert_user(10000,1000000);