我有一个表,并希望使用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论坛