Ubuntu 12.04下源代码安装MySQL5.6以及Python-MySQLdb
--------------------------------------分割线 --------------------------------------
二,分析原因
因为才14个汉字中取一个(数据源太少了),而且连续执行100次,有连续出现重复的随机数是正常的,应该是底层的rand算法没有考虑过滤到连续重复的情况,我们不好去改动底层的mysql源码,但是可以在存储过程中做一个判断,来过滤掉连续重复的情况,思路是如果重复,就重新取一个不重复的。
所以存储过程改动如下:
1.DELIMITER $$
2.USE `test`$$
3.DROP PROCEDURE IF EXISTS `pro3`$$
4.CREATE PROCEDURE `pro3`(num INT)
5.BEGIN
6.DECLARE fname CHAR(1);
7.DECLARE name1 CHAR(1);
8.DECLARE name2 CHAR(1);
9.DECLARE fullname VARCHAR(3);
10.DECLARE pre_fullname VARCHAR(3) DEFAULT \'\';
11.DECLARE age INT;
12.DECLARE i INT DEFAULT 1;
13.WHILE i <=num DO
14. SET fname = SUBSTRING(\'赵钱孙李周吴郑王\',FLOOR(1+8*RAND()),1);
15. SET name1 = SUBSTRING(\'一二三四五六七八九十甲乙丙丁\',ROUND(1+14*RAND()),1);
16. SET name2 = SUBSTRING(\'一二三四五六七八九十甲乙丙丁\',ROUND(1+14*RAND()),1);
17.
18. IF ROUND(RAND())=0 THEN
19. SET fullname = CONCAT(fname,name1);
20. END IF;
21. IF ROUND(RAND())=1 THEN
22. SET fullname = CONCAT(fname,name1,name2);
23. END IF;
24.
25. SET age = FLOOR(20+31*RAND());
26. /* 给临时变量赋值,看最新的一条记录的name值 */
27. SELECT NAME INTO pre_fullname FROM user1 ORDER BY id DESC LIMIT 1;
28. /* 开始判断,如果刚赋值的name跟上一次赋值的name值一样,就跳过,i保持不变,继续取值;否则i+1,继续循环取值*/
29. IF fullname=pre_fullname AND i>1 THEN
30. SET i=i;
31. ELSEIF fullname IS NULL THEN
32. SET i=i;
33. ELSE
34. INSERT INTO user1 VALUES(NULL,fullname,age);
35. SET i = i + 1;
36. END IF ;