1.引入:
我们在之前的MySQL基础中说过MySQL数据库的函数和存储过程。那么其实俩个都是使用数据库编程语言写的脚本语言。主要是为了解决批量数据的插入。其中,函数有返回值。存储过程没有返回值。
2.数据测试准备
(1).准备创建数据库表SQL
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(2).查看结果:
3.参数:log_bin_trust_function_creators的设置
(1).该参数的意义:
当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。 设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。 此变量也适用于触发器的创建。
当开启二进制日志后,如果变量log_bin_trust_function_creators为OFF,那么创建或修改存储函数就会报“ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)”
(2).设置参数
#查看该参数的开启状态
show variables like '%log_bin_trust_function_creators%';
#设置该参数开启
set global log_bin_trust_function_creators = 1;
结果如下:
注意:如果需要永久有效,那么需要在爱配置文件中进行改参数的配置。
4.创建插入数据的函数
(1).查看表以及数据格式内容
(2).创建一个生产随机数据的函数
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 $$
执行结果如下:
5.创建存储过程
编写插入user表数据的存储过程
DELIMITER $$
CREATE PROCEDURE insert_user(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 user(username,password) VALUES((START + i),rand_string(6),rand_string(6));
UNTIL i = max_num
END REPEAT;
COMMIT;
END $$
执行结果如下:
6.调用存储过程
#修改结束标志
DELIMITER ;
#调用存储过程
CALL insert_user(100,10);
调用直接插入数据并查看结果:
插入大量数据并查询结果:10万条记录