MySQL如何生成随机数据 RAND函数与测试数据生成技巧

上周我尝试使用 MySQL 生成随机数据。
主要依赖RAND()函数。

例如,生成 0 到 1 00 之间的浮点数: SQL 选择 RAND()1 00;
要生成 0 到 9 9 之间的整数: SQL 选择楼层(RAND()1 00);
FLOOR() 向下舍入。
CEILING() 轮。
ROUND() 轮次。

生成随机字符串: SQL 选择子串(MD5 (RAND()),1 ,1 0);
这可以生成 1 0 个随机字母数字字符。

使用存储过程批量生成数据非常高效。
例如: SQL 创建过程generate_test_data(IN num_rows INT) 开始 声明 i INT 默认值 0; 当我 < num xss=clean>一次调用可以生成 1 00 个项目。

为了优化,您可以首先使用临时表: SQL 创建临时表 temp_data AS 选择 FLOOR(RAND()1 00) AS 列 1 , SUBSTRING(MD5 (RAND()),1 ,1 0) AS 列 2 FROM (SELECT 1 AS n UNION ALL SELECT 1 UNION ALL SELECT 1 ) AS 编号 LIMIT 1 000;
然后插入到官方表中。

生成手机号码可以指定号码段: SQL 设置@前缀='1 3 8 '; SET @random_number = FLOOR(RAND()1 00000000); SELECT CONCAT (@prefix, LPAD (@random_number,8 ,'0'));
检查质量很重要。
检查唯一性: SQL 从 your_table 中选择 COUNT(DISTINCT 列 1 );
控制范围: SQL 从 your_table 中选择 MIN(列 1 )、MAX(列 1 );
格式可以是常规的: SQL 从 your_table 中选择,其中第 2 列不是 REGEXP '^[a-zA-Z0-9 ]+$';
我只是想到了别的事情,生成随机日期: SQL 设置@start_date = '2 02 3 -01 -01 '; 设置@end_date = '2 02 3 -1 2 -3 1 '; SELECT DATE_ADD (@start_date, INTERVAL FLOOR(RAND()(TIMESTAMPDIFF(DAY,@start_date,@end_date))) DAY);
小心外键关联。
您可以首先使用: SQL 从相关表中选择 id ORDER BY RAND() LIMIT 1 ;
然后随机选择一个ID。
算了,我就不细说了。
这是你的。

在mysql 数据库如何添加随机数字

哦,是的,这两个 MySQL 函数真的很好用。
Floor() 四舍五入到最接近的整数,例如 3 .9 取为 3 rand() 是随机的,范围总是在 0 到 1 之间,包括 0 但不包括 1 如果 rand 后跟整数参数,如 rand(5 ),则会生成 0 到 5 之间的数字,每次结果都相同。

如果要生成 i 和 j 之间的随机整数,请使用公式 FLOOR(i+RAND()(j–i+1 ))。
例如,要生成 7 到 1 2 之间的随机整数,则为 FLOOR(7 +(RAND()6 ))。
你看,7 是起点,1 2 是终点。
rand() 生成一个0到1 之间的数字,乘以6 后是0到6 ,加7 后是7 到1 3 ,然后向下取整,正好是7 到1 2
说实话,当时我不明白为什么要加1 想了半天,发现rand()的值最多为1 ,并且不包含1 如果范围是7 到1 2 ,则需要1 2 -7 +1 =6 个数字才能覆盖1 2 如果不加1 ,当rand()接近1 时,结果将是1 1 ,这对于1 2 来说是不够的。

举个小例子,运行楼层(7 +(兰德()6 ))。
如果 rand() 得到 0.5 ,则结果为 FLOOR(7 +0.5 6 )=FLOOR(7 +3 )=1 0如果 rand() 得到 0.9 9 9 ,则结果为 FLOOR(7 +0.9 9 9 6 )=FLOOR(7 +5 .9 9 4 )=1 2 你看,它是一个7 到1 2 之间的数字。

使用它时,请注意rand()每次执行时都会重新生成一个随机数。
如果你想固定一些随机数,可以在程序中设置一个rand(固定数)。
例如,您可以在PHP中使用mt_rand(7 ,1 2 ),在mysql中使用FLOOR(7 +(RAND(5 )6 )),这样每次结果都相同。

MySQL优化技巧:RAND()和WITH ROLLUP、Bit GROUP以及外键注意事项

说实话,当我第一次接触 MySQL 正则表达式时,就像在黑暗中寻找灯泡一样。
REGEXP 函数确实很难用。
我记得有一个项目,我想过滤掉用户邮箱中的随机字符。
当时通过直接替换为正则表达式使用了很长时间,发现性能慢得要命。
想了想,比如我可以使用LIKE '%@%.%'这样的简单匹配来选择不需要使用正则表达式即可划分的项,然后使用正则表达式处理其余的项。
您会立即注意到速度显着提高。
这是让我印象特别深刻的一点,可能有点极端,但掌握规则的关键是知道什么时候使用它们,什么时候改变策略。

有趣的是MySQL的万能钥匙,RAND()函数。
之前我在做一个抽红包的活动,我直接在查询中添加 RAND() ORDER BY RAND() LIMIT 1 。
我们发现,当我们运行数千条数据时,CPU直接跳到1 00%。
我查了资料,发现为了让批处理稳定首先需要运行 SELECT RAND() AS rand FROM table GROUP BY rand ORDER BY rand LIMIT 1 坦白说,随机数生成看似简单,但背后隐藏着数据库优化的巨大陷阱。

我没有太多使用WITHROLLUP子句,但是当我使用时它看起来非常好。
我记得有一个报告要求,要同时查看每个部门和整个公司的销售情况。
我曾经写过两条 SQL,但后来我意识到,WITHROLLUP 允许我在一行中完成,并且它会自动添加一个摘要行,使之变得更加容易。
至于BITGROUPFunction,我更喜欢用它来处理二进制数据。
例如,某些系统状态表示为 8 位二进制文​​件,并且 BIT_COUNT 用于对开放位进行计数。
这比手动拆卸字段要快得多。
就数据库名称而言,我遇到了一件奇怪的事情,Linux 系统将表名 table 和 TABLE 视为两个不同的事物。
毕竟,您只能硬编码全部大写或全部小写,这就是您所需要的。

关于外键约束,我继承了一个旧项目,发现所有表都是通过外键关联的。
如果稍微更改字段顺序,导入的数据将被损坏。
我差点忘了比较 InnoDB 和 MyISAM。
无论如何,如果使用过多的外键,则需要注意级联更新和删除的细节。
否则,一个错误的操作就可能导致一整张表的数据都跟着跟着走,想想就让人毛骨悚然。
不管你学了多少优化技术,你仍然需要通过陷阱来积累经验。
例如,我有一个同事忘记添加外键约束,所以数据是导入两次。
最后,他只能暴力删除数据库,重新开始。
那个场景……我再也不敢碰了。

现在使用MySQL,习惯查看官方文档。
它可能写得像圣经,但至少是准确的。
我记得有一次版本升级后,某个函数的参数发生了变化,直接导致整个查询崩溃。
幸运的是,我事先阅读了文档并进行了更改。
因此,这些优化技术并不是光看就能学会的。
应该根据现实场景进行尝试和测试。