我有这样的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)以减少冲突。 –