随机唯一的Mysql Id


Random unique Mysql Id

我有一个表,并希望使用1 mysql查询生成随机唯一值。表结构如下:

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

unique_id is integer(10)

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

Algorytm是:

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只是一个例子,使用这样的multiplier

很容易重现这个问题

这样做的一种方法是使用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

您需要将值插入到表中。而且,不能保证你能得到一个不在表中的值,但它应该能处理多达数百万个值。

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

参考:MySQL论坛