我有这个PHP代码,它将生成一个随机的6个字母的订单号:
<?php
$random = mt_rand(100000,999999);
echo $random;
?>
我可以在我的数据库中插入这个号码,但是如何确保没有dublicates,ordernumber是唯一的?
答案 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
功能执行相同操作