我有这个 PHP 代码,它将生成一个随机的 6 个字母的订单号:
<?php
$random = mt_rand(100000,999999);
echo $random;
?>
我可以在我的数据库中插入这个号码,但我如何确保没有重复,并且订单号是唯一的?
您可以将数据库列设为唯一。还可以在插入检查该列是否已经具有该值之前进行仔细检查。
您应该在数据库中的该字段上简单地创建 UNIQUE INDEX。生成数字,检查它是否存在于db中,如果存在,重试直到不存在。
您应该确保随机密钥的地址空间没有太多填充,否则生成没有冲突的新密钥将变得太慢。
只要行数少于可能的地址空间的 10%,这种方法就可以正常工作。但是如果达到 50% 或更多,那将是相当糟糕的。
您还可以创建一些创造性的方案来尝试保留迄今为止未使用的密钥列表,但这可能太复杂了。
将数字设置为唯一索引,并在发现重复项时捕获错误。或者只是使用 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
}
?>
但这不是好方法,而是使用自动增量
在插入之前检查该数字是否存在于数据库中。如果是,则生成另一个随机数并再次进行检查,依此类推。但我建议您使用该auto increment
功能来做同样的事情