2013-04-17 49 views
-2

我有這樣的PHP代碼,會生成一個隨機的6封信訂單編號:保存獨一無二的隨機數

<?php 
$random = mt_rand(100000,999999); 
echo $random; 
?> 

我可以在數據庫中插入這個號碼,但如何確保有是不是dublicates,訂單號碼是獨一無二的?

+1

爲什麼亂?也許從100000開始使用自動增量? –

+1

ORDER BY RAND是一個沉重的陳述,它不建議在大型數據庫上做這件事 –

+0

考慮使用[UUID v4 generator](http://stackoverflow.com/questions/2040240/php-function-to-generate-v4-uuid/15875555#15875555)以減少衝突。 –

回答

0

您可以將數據庫列設置爲唯一。在插入之前還要進行雙重檢查,檢查該列是否已具有該值。

0

您應該簡單地在數據庫中的此字段上創建UNIQUE INDEX。生成號碼,檢查它是否存在於分貝中,如果是的話,再試一次,直到它沒有。

唯一的問題是,您應該確保您的隨機密鑰的地址空間不會過多,否則在沒有碰撞的情況下生成新密鑰會變得太慢。

只要行數少於可能的地址空間的10%,這種方法應該可以很好地工作。但50%或更多,這將是相當糟糕的。

您還可以創建一些創新方案,試圖保留迄今未使用的密鑰列表,但這可能太複雜。

0

插入前檢查數據庫中是否存在該數字。 如果是生成另一個隨機數,並做了一次檢查等。但我建議你使用auto increment功能做同樣的

0

設置號碼作爲唯一索引,趕上其中一個重複發現錯誤。或者只是使用MySQL函數RAND()來生成數字,然後檢索該值。

你可以在一個INSERT語句中完成它。像這樣的東西(儘管這個特殊的例子顯着減慢的行數的增加)

INSERT INTO numbers (SomeNumber) 
SELECT aNum 
FROM (SELECT a.i+b.i*10+c.i*100+d.i*1000+e.i*10000 AS aNum 
FROM integers a, integers b, integers c, integers d, integers e) Sub1 
LEFT JOIN Numbers ON Sub1.aNum = Numbers.SomeNumber 
WHERE Numbers.SomeNumber IS NULL 
ORDER BY RAND() 
LIMIT 1 

還是有很多更高效,但保留所有行都將被插入的可能性(它會產生10張隨機數,並挑選一個這是未使用的插入),因此你需要檢查受影響的行,如果0再試一次: -

INSERT INTO numbers (SomeNumber) 
SELECT aNum 
FROM (SELECT ROUND(RAND() * 899999) + 100000 AS aNum 
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum 
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum 
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum 
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum 
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum 
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum 
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum 
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum 
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum) Sub1 
LEFT JOIN Numbers ON Sub1.aNum = Numbers.SomeNumber 
WHERE Numbers.SomeNumber IS NULL 
LIMIT 1 

有了這兩個例子中,你可以檢索已插入行的id,然後從選擇號碼插入。

0
<?php 
$random = mt_rand(100000,999999); 
echo $random; 
$sql ="SELECT FROM table where ordernumber=$random"; 
$result = mysqli_query($conn,$sql); 
if(mysqli_num_rows($result)>0){ 
// regenerate random number 
} 
else{ 
//insert here 
} 
?> 

但這並不是好方法,而使用自動增量

+0

請不要提供已棄用PHP函數的答案 - mysql_ * – Svetoslav