2013-04-17 51 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