我有這樣的PHP代碼,會生成一個隨機的6封信訂單編號:保存獨一無二的隨機數
<?php
$random = mt_rand(100000,999999);
echo $random;
?>
我可以在數據庫中插入這個號碼,但如何確保有是不是dublicates,訂單號碼是獨一無二的?
我有這樣的PHP代碼,會生成一個隨機的6封信訂單編號:保存獨一無二的隨機數
<?php
$random = mt_rand(100000,999999);
echo $random;
?>
我可以在數據庫中插入這個號碼,但如何確保有是不是dublicates,訂單號碼是獨一無二的?
您可以將數據庫列設置爲唯一。在插入之前還要進行雙重檢查,檢查該列是否已具有該值。
您應該簡單地在數據庫中的此字段上創建UNIQUE INDEX。生成號碼,檢查它是否存在於分貝中,如果是的話,再試一次,直到它沒有。
唯一的問題是,您應該確保您的隨機密鑰的地址空間不會過多,否則在沒有碰撞的情況下生成新密鑰會變得太慢。
只要行數少於可能的地址空間的10%,這種方法應該可以很好地工作。但50%或更多,這將是相當糟糕的。
您還可以創建一些創新方案,試圖保留迄今未使用的密鑰列表,但這可能太複雜。
插入前檢查數據庫中是否存在該數字。 如果是生成另一個隨機數,並做了一次檢查等。但我建議你使用auto increment
功能做同樣的
設置號碼作爲唯一索引,趕上其中一個重複發現錯誤。或者只是使用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,然後從選擇號碼插入。
<?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
}
?>
但這並不是好方法,而使用自動增量
請不要提供已棄用PHP函數的答案 - mysql_ * – Svetoslav
爲什麼亂?也許從100000開始使用自動增量? –
ORDER BY RAND是一個沉重的陳述,它不建議在大型數據庫上做這件事 –
考慮使用[UUID v4 generator](http://stackoverflow.com/questions/2040240/php-function-to-generate-v4-uuid/15875555#15875555)以減少衝突。 –