php mysql插入唯一值

定义port为随机五位数,然后向表中插入数据,其中port是唯一值, 由于表中已经存在大量记录,提交后经常出现重复的错误提示,如何解决

$port=rand(10000,54999);

$con = mysqli_connect("sever","user","passwd");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysqli_query($con,"INSERT INTO dbdb.list (port, wechat) VALUES ( '".$port."', 'wechat') or die(mysqli_error($con));

mysqli_close($con);

<?php
$con = mysqli_connect("sever","user","passwd");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

function create_code(){//生成唯一5位数
    global $con;
    mt_srand((double)microtime() * 1000000);//用 seed 来给随机数发生器播种。
    $port=mt_rand(10000,54999);
    $query =mysqli_query($con,"select * from dbdb.list where port='".$port."'");
    $rt =mysqli_fetch_array($query,MYSQLI_ASSOC); 
    if($rt){//判断随机数是否存在,存在就重新生成,直到不存在为止
        $port=create_code();
    }
    return $port;
}
$port=create_code();
mysqli_query($con,"INSERT INTO dbdb.list (port, wechat) VALUES ( '".$port."', 'wechat')") or die(mysqli_error($con));
mysqli_close($con);
?>

简单的一个例子

这个可以使用批量生成唯一值,然后取并集,然后再取余集,可以快速完成大量的port的生成,集合的操作比一个一个mysql的判断要快,这个随机的port可以先存在某个临时缓存中,然后再操作

1.用自增发(肯定不符合你的)
2,再redis 批量生产 10000 - 54999 数字 放入 无须zet 中,然后随机读取
redis> SADD myset "100000"
(integer) 1
redis> SADD myset "10001"
(integer)
。。。
redis> SADD myset "54999 "
(integer) 1
redis> SPOP myset
"10101"

redis> SPOP myset 3

  1. "10201"
  2. "10121"
  3. "10141"

replace into 。给port unique索引 相同的记录,则先删除掉。再插入新记录

insert前先查询生成的port是否存在,存在的话重新生成,直到不存在以后再insert


// 自动生成随机用户名
// 测试,循环创建25万个随机账号,0碰撞,足够应付未来数十亿级PV
function genUserName()
{
    $microtime = substr(microtime(true), strpos(microtime(true), ".") + 1);
    $chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $username = "";
    for ($i = 0; $i < 6; $i++) {
        $username .= $chars[mt_rand(0, strlen($chars))];
    }
 
    return $microtime . strtoupper(base_convert(time() - 1420070400, 10, 36)) . $username;
}