0-9之间的数字,随机生成一个7位数,保存入数据库,此数据不能和以前的数据重复,唯一性
楼上有几位说的时间戳的方法貌似也不行的,时间戳加上去的话超出了七位数字,如果取时间戳的一部分,那么还是会重复的
最简单的,就是从0开始自动增长编号。7位数字随机生成,无论什么算法,在你的数据量超过1000万以后肯定重复。
比如id给他加个自增,位数不够前面补0,
1,新建一个数组放0-7
2.根据这个数组生成随机数
3,。判断这个随机数不和之前的重复即可
他们说的自增是一种方法,我记得有一个函数可以生成随机数,并且可以设置他的属性,设置之后,每次的随机数都不会重复,你可以百度一下那个属性是什么?我记得不太清楚了 ,很抱歉,但是我确定有!
用UUID不是比这个方便么。
使用redis incr 去生成这个数字 ,还能在高并发的情况下正常
其实我觉的想要不重复,首先保证有一定的规律会好一点,比如递增之类的。
不过要是觉得递增不合适,可以试试根据保存时的时间戳来生成一个伪随机的。
其实我觉的可以参考一下移动运营商选手机号之类的方法,在一个地方把这个区间所有的值都保存好,每次随机抽取一个。
建议使用 UUID,如果自己要实现无重复生成随机数据需要加入时间戳
可以使用java或者是其他的编程工具自带生成随机的数字,选择对这个数字操作,转为string类型,之后截取7位就可以了呀
你可以利用时间戳呀,对不对
可以使用java或者是其他的编程生成随机的数字,选择对这个数字操作不就行了
每次你还得判断一下是不是重复值,累么?
7位的数字可以用随机数,不够就填0,每次判断ID是否与之前的重复,不重复就获取,重复就再生出一次。
利用java的uuid自动生成
建议使用uuid加时间戳,这样比较保险。
可以用new Date().getTiem(),仅供参考,这样也不会重复,如果想截取,也可以自行截取操作。
用随机函数和一个数组标记就行,定义一个10^7大小的bool数组,初始化为false,标记之前是否出现过此随机数,随机产生一个七位数num,并进行判断,如果没出现过就把bool[num]值赋为true,出现过就再生成一次,直到产生之前没出现过的数。
直接数据库写函数,loop和end loop 之间通过 trim(to_char(trunc(dbms_random.value*10000000),'0999999'))获得随机七位数,
然后去目标表查询,如果目标表不存在对应的编号则退出循环,把随机结果返回(A表示目标表,NO表示目标字段)
create or replace function get_NO
return varchar2 is
Result varchar2(100);
v_exists number;--是否存在
--错误信息
v_errmessage varchar2(3000);
begin
loop
Result := trim(to_char(trunc(dbms_random.value*10000000),'0999999'));
select count(1) into v_exists from A t
where t.NO = Result;
if (v_exists = 0) then
exit;--退出循环
end if;
end loop;
return(Result);
exception
when others then
v_errmessage := SQLERRM;
dbms_output.put_line(v_errmessage);
Result := '';
return (Result);
end get_NO;
生成的随机数作为主键,就避免了重复。
Oracle数据库的话建议可以用序列sequence,设置一个1000000位最小值,9999999位上限,你数据量小,够你用了,
这个 肯定会重复 数据到一定的大小后... 用 采用大小写字母+随机数字 比较好
比如id给他加个自增,位数不够前面补0,
document.write(Math.round(Math.random() * (9999999 - 0)) + 0);用UUID然后截取7位数。或者自己写一个随机的程序然后每次存入库中判断库中是否存在,存在则重新生成,不存在则插入
random() + 遍历历史
我觉得你可以在数据库将这7位数设为主键,直接生成7位的随机数,存入数据库,用try/catch捕获异常,在catch处捕获异常信息是否是主键重复
catch (Exception e) {
if(e.getStackTrace().toString().equals("你可以先试一下主键重复报的异常信息字符串是什么,然后复制下来填在这里")){
//这里继续调用你的生成随机数存入数据库方法,或者记录你刚生成的随机数为key,直接+1往后找若加到8位则从key-1往前找,细致的算法问题你
//自己想着写吧、
}
e.printStackTrace();
}
整体思路就是这样,我觉得可行,你可以试试,成功了望采纳、