在MySQL数据库中保存唯一的随机订单号


Save unique random order number in MySQL database

我有这个PHP代码,它将生成一个随机的6个字母的ordernumber:

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

我可以在我的数据库中插入这个数字,但是我如何确保没有重复,并且订单号是唯一的?

可以将数据库列设置为Unique。在插入之前,还可以检查该列是否已经有该值

您应该简单地在数据库的这个字段上创建UNIQUE INDEX。生成编号,检查db中是否存在,如果存在,再试一次,直到不存在为止。

唯一需要注意的是,您应该确保随机密钥的地址空间没有被过多填充,否则生成没有冲突的新密钥将变得太慢。

只要行数小于可能的地址空间的10%,这种方法应该工作得很好。但如果超过50%,情况就相当糟糕了。

您还可以创建一些创造性的方案,尝试保留到目前为止未使用的键的列表,但这可能太复杂了。

<?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
}
?>

,但这不是一个好方法,而应该使用自动递增

将数字设置为唯一索引,并在发现重复时捕获错误。或者直接使用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,然后从中选择插入的数字。

插入前检查号码是否在数据库中存在。如果是,则生成另一个随机数并再次进行检查,依此类推。但是我建议您使用auto increment功能来执行相同的操作