SELECT elt(1 + floor(rand() * 36),
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
'A','B','C','D','E','F','G',
'H','I','J','K','L','M','N',
'O','P','Q','R','S','T',
'U','V','W','X','Y','Z') as val;
val|
以上语句返回了一个随机的数字或者大写字母,将其替换到 rand_string 函数可以返回一个由数字和大写字母组成的随机字符串。
那么,怎么返回一个长度可变的随机字符串呢?很简单,为 rand_string 函数指定一个随机的长度参数即可。例如:
SELECT rand_string(floor(10 + rand() * 11));
rand_string(floor(10 + rand() * 11))|
4U13MjO+($}k"cO@5%[ |
以上示例返回了一个长度大于等于 10 且小于等于 20,由可打印字符组成的随机字符串。
将指定日期增加一个随机的数字,就可以得到随机的日期。例如:
SELECT date_add('2020-01-01', interval rand() * 31 day) rand_date;
rand_date |
2020-01-19|
以上示例返回了 2020 年 1 月中的某个随机日期。以下语句则返回了一天中的某个随机时间:
SELECT sec_to_time(rand() * 3600) rand_time;
rand_time |
00:05:29.546878000|
其中,sec_to_time 函数用于将秒数转换为时间数据。
对于返回多行数据的查询语句,RAND 函数每次都会返回不同的随机数据。例如:
SELECT rand(1) FROM employee;
rand(1) |
0.40540353712197724|
0.8716141803857071|
0.1418603212962489|
...
利用这个特性,我们可以从表中返回随机的数据行。例如:
SELECT emp_id,emp_name
FROM employee
ORDER BY rand(1)
LIMIT 5;
emp_id|emp_name |
6|魏延 |
14|张苞 |
16|周仓 |
15|赵统 |
1|刘备 |
以上示例从 employee 表中返回了 5 行随机记录。该方法需要为表中的每行数据都生成一个随机数,然后进行排序;所以会随着表中的数据量增加而逐渐变慢。
如果表中存在自增主键,也可以基于主键生成一个随机数据。例如:
SELECT round(rand() * (SELECT max(emp_id) FROM employee)) AS id;
10.0|
然后基于这个随机数返回一条随机的记录:
SELECT e.emp_id, e.emp_name
FROM employee e
INNER JOIN (SELECT round(rand() * (SELECT max(emp_id) FROM employee)) AS id
) AS t
WHERE e.emp_id >= t.id
LIMIT 1;
emp_id|emp_name|
9|赵云 |
这种方法一次只能返回一条随机记录,而且只有当自增字段的值没有间隙时才会返回均匀分布的随机记录。
UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一个 128 比特的数字,可以用于唯一标识每个网络对象或资源。由于它的生成机制,一个 UUID 可以保证几乎不会与其他 UUID 重复,因此常常用于生成数据库中的主键值。
MySQL 提供了一个系统函数 UUID,可以用于生成 UUID。例如:
SELECT uuid();
uuid() |
35f67fde-e0e9-11ea-9d25-0800272142b1|
如果想要生成没有中划线(-)的 UUID,可以使用 REPLACE 函数:
SELECT replace(uuid(),'-','');
replace(uuid(),'-','') |
8505290be0ea11ea9d250800272142b1|
除此之外,MySQL 还提供了一个 UUID_SHORT 函数,它可以返回一个 64 比特的无符号整数。例如:
SELECT uuid_short();
uuid_short() |
98862025337208832|
该函数返回的是一个“短的”唯一标识符,只有满足以下条件时才具有唯一性:
- 当前服务器的 server_id 位于 0 到 255 之间,并且在复制结构中具有唯一性;
- 重启 mysqld 前后没有将服务器主机的系统时间往回调整;
- 每秒钟的平均调用次数少于 1600 万次。
本文介绍了在 MySQL 数据库中生成随机数据的方法,包括随机数字、验证码、随机字符串以及随机日期和时间等,同时还介绍了如何从表中返回随机记录,以及如何生成 UUID。
如果觉得文章对你有用,欢迎关注❤️、评论📝、点赞👍!