随机唯一的Mysql Id

时间:2013-01-12 14:16:08

标签: php mysql sql

我有一个表,并希望使用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,用这样的乘数很容易重现这个问题

2 个答案:

答案 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