我有一个表,并希望使用1个mysql查询为其创建随机唯一值。 表结构如:
id | unique_id
1 | 1
2 | 5
3 | 2
4 | 7
等
unique_id是整数(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
但它不会生成唯一值..
注意:例如,乘数= 9,用这样的乘数很容易重现这个问题
答案 0 :(得分: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
您需要将值重新插入表格中。并且,无法保证您实际上能够获得不在表中的值,但它应该适用于高达数百万的值。
答案 1 :(得分:0)
如果您可以使用MD5哈希作为unique_ID,请转到MD5(NOW())。这几乎肯定会每次生成一个唯一的ID。
参考:MySQL Forums