3

我有一个表,想使用 1 个 mysql 查询为其生成随机唯一值。表结构如:

id | unique_id
1  | 1
2  | 5
3  | 2
4  | 7

ETC

unique_id 是 integer(10) 无符号

所以我想每次都用唯一的随机值(在我的例子中不是 1、5、2、7)填充 unique_id 字段。

算法是:

1. Get 1 unique random value, which will not have duplicates in unique_id field
2. Create new row with unique_id = result of 1 query

我试过了

SELECT FLOOR(RAND() * 9) AS random_number 
FROM table 
HAVING random_number NOT IN (SELECT unique_id FROM table) 
LIMIT 1

但它不会产生唯一的价值..

注意:multiplier = 9 仅作为示例给出,使用这样的乘数很容易重现此问题

4

2 回答 2

3

一种方法是使用id列,就像随机排列一样:

select id
from tables
order by rand()
limit 1

(您的示例仅返回一个值。)

要为每个 id 返回一个可重复的随机数,您可以执行以下操作:

select id,
       (select count(*) from table t2 where rand(t2.id) < rand(t.id)) as randomnumber
from table t

这样做是通过为随机数生成器播种来产生稳定的排序顺序。这保证了唯一性,尽管这不是特别有效。

使用变量的更有效的替代方法是:

SELECT  id, @curRow := @curRow + 1 AS random_number
FROM table CROSS JOIN (SELECT @curRow := 0) r
order by rand()

注意:这会返回不超过表大小的随机数,不一定来自 id。这可能是件好事。

最后,您可以了解到您正在尝试使用一些技巧。计算一个 md5 哈希,然后将前四个字符转换为整数并在表中检查:

SELECT convert(hex(left(md5(rand()), 4)), unsigned) AS random_number 
FROM table 
HAVING random_number NOT IN (SELECT unique_id FROM table) 
LIMIT 1

您需要将该值重新插入表中。而且,不能保证您实际上能够获得表中没有的值,但它应该适用于多达数百万个值。

于 2013-01-12T14:21:55.730 回答
0

如果您可以使用 MD5 哈希作为 unique_ID,请选择 MD5(NOW())。这几乎肯定会每次都生成一个唯一的 ID。

参考:MySQL 论坛

于 2013-01-12T14:23:19.403 回答