2013-01-12 142 views
3

我有一个表,并希望使用1个mysql查询来给它赋予随机唯一值。 表结构等:随机唯一的Mysql ID

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

UNIQUE_ID是整数(10)无符号

所以我想fullfill UNIQUE_ID场与唯一的随机值(不为1,5,2,7我的例如)每次。

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给出只是举例,它很容易用这种乘数重现这个问题

回答

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() 

注:此方法返回随机数到表的大小,不一定是从IDS。这可能是一件好事。

最后,你可以得到你正在尝试使用一些技巧的想法。计算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 

你需要插入值回表。而且,不能保证你实际上能够得到一个不在表格中的价值,但它应该可以达到数百万的价值。

+0

UNIQUE_ID必须查询 – freento

+0

之后独一无二的 - 或全部 - 只是改变了限制条款。您问题中的示例仅返回一个ID。删除限制并获得每个ID的唯一编号(来自ID集合 - 这对于0-8示例显然不起作用)。 –

+0

他们为什么是独一无二的? select from order by rand() limit 1 将返回重复次数soometimes – freento

0

如果您可以使用MD5散列作为unique_ID,请转到MD5(NOW())。这几乎肯定会每次生成一个唯一的ID。

参考:如果你需要不止一个ID MySQL Forums

+0

unique_id是整数字段。我需要100%确定unique_id是唯一的。 – freento

+1

你有没有试过增加你的'RAND()'函数的乘数?在相对的意义上,随着这个池的缩小,一个现有的标识符将会遇到更多。 unique_id字段的大小是否有限制? –

+0

unique_id是整数(10)无符号的 我将此添加到问题中。 是的,没有问题来增加乘数,但结果数字不会是唯一的,但它们可以在某些时候被复制:)我需要非常独特的价值,我没有出错的余地。 – freento