2013-01-12 181 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