学习了《mysql 存储过程和函数》,进行实战。
要测验sql的执行情况,因为建个大量数据。因此考虑用过程/函数的方式来处理。
人员表
DROP TABLE IF EXISTS staff;
CREATE TABLE staff (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) DEFAULT NULL,
dep_id int(11) DEFAULT NULL,
age int(11) DEFAULT NULL,
salary decimal(10,2) DEFAULT NULL,
cus_id int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
人名用随机字符串来生成。
随机字符串
#随机生成一个指定个数的字符串
DELIMITER //
CREATE FUNCTION rand_str(n INT) RETURNS VARCHAR(255)
BEGIN
# 声明一个str 包含52个字母
DECLARE str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
# 记录当前是第几个
DECLARE i INT DEFAULT 0;
# 生成的结果
DECLARE res_str VARCHAR(255) DEFAULT '';
WHILE i < n DO
SET res_str = CONCAT(res_str, SUBSTR(str,FLOOR(1 +RAND()*52),1));
SET i=i+ 1;
END WHILE;
RETURN res_str;
END //
DELIMITER ;
如果报错:
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)
设置:
SET GLOBAL log_bin_trust_function_creators = TRUE;
存储过程
DELIMITER //
CREATE PROCEDURE insert_staff(IN max_num INT)
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
REPEAT
SET i=i+ 1;
INSERT INTO staff(NAME, dep_id, age, salary, cus_id)
VALUES(rand_str(5), FLOOR(1 + RAND()*10), FLOOR(20 + RAND()*10),
FLOOR(6000 + RAND()*10), FLOOR(1+RAND()*10));
UNTIL i = max_num
END REPEAT;
COMMIT;
END //
DELIMITER ;
调用
-- 插入9千万的数据
CALL insert_staff(90000000);
这个执行时间会比较长,要等待一段数据。
总结:
如果要生成大量的测试数据,可以考虑用存储过程或者函数的方式来处理,用随机字符串和数字来进行处理。
上一篇: 《mysql 存储过程和函数》
下一篇: 《》

4540

被折叠的 条评论
为什么被折叠?



