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

时间:2013-04-17 09:00:53

标签: php mysql sql database

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

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

我可以在我的数据库中插入这个号码,但是如何确保没有dublicates,ordernumber是唯一的?

5 个答案:

答案 0 :(得分:0)

您可以将数据库列设置为“唯一”。另外,在插入之前进行仔细检查,检查该列是否已经具有该值。

答案 1 :(得分:0)

您只需在数据库中的此字段上创建UNIQUE INDEX即可。生成数字,检查它是否存在于db中,如果是,则再试一次,直到它不存在。

唯一应该确保随机密钥的地址空间不会过多填充,否则生成新密钥而不会发生冲突会变得太慢。

只要行数小于可能的地址空间的10%,此方法应该可以正常工作。但是,如果达到50%或更多,那将会非常糟糕。

你也可以创建一些创新的方案,试图保留到目前为止未使用的密钥列表,但这可能太复杂了。

答案 2 :(得分: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,然后从中选择插入的数字。

答案 3 :(得分: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
}
?>

但这不是好方法而是使用自动增量

答案 4 :(得分:-1)

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