v_num number;
v_id varchar2(30);
Cursor cur_dzk Is Select * From t_user_jbxx t Order By t.userid;
begin
v_num:=0;
For cur_mlxz In cur_dzk Loop
v_num:=v_num+1;
v_id :='000000000000'||to_char(sysdate,'yyyymmddhh24miss')TRUNC(DBMS_RANDOM.value(1000,9999));
insert into t_user_jbxx (id)values(v_id);
end loop;
if (v_num mod 1000)=0 then
commit;
end if;
commit;
end;
结果发现这个表中的id既然有很多重复的,奇怪了,按理说每次循环时间都变的啊 ,是不是电脑执行太快了,一秒钟循环了很多此,才导致有重复的?有其他办法吗,生产随机数,主要是后18位?
6 个解决方案
#1
随机数不能保证不重复,即然你已经使用循环了,使用v_num来拼接不就行了
v_id := '000000000000' || to_char(SYSDATE, 'yyyymmddhh24miss') || lpad(to_char(v_num), 4, '0');
或者使用序列sequence来生成ID保证唯一性。
v_id := '000000000000' || to_char(SYSDATE, 'yyyymmddhh24miss') || lpad(to_char(v_num), 4, '0');
或者使用序列sequence来生成ID保证唯一性。
#2
1:且不说别的
'000000000000'||to_char(sysdate,'yyyymmddhh24miss')TRUNC(DBMS_RANDOM.value(1000,9999)); 这里就有错误
改为
'000000000000'||to_char(sysdate,'yyyymmddhh24miss')||TRUNC(DBMS_RANDOM.value(1000,9999))
2.DBMS_RANDOM.value(1000,9999)用这个本来就有重复的
要想唯一可以这样
v_id :='000000000000'||to_char(sysdate,'yyyymmddhh24miss')||to_char(v_num);
或者用序列加触发器
#3
v_id :='000000000000'||to_char(sysdate,'yyyymmddhh24miss')||to_char(v_num,'fm0000');
#4
有个系统函数你可以用一下,sys_guid() 可以生成32位的唯一数,保证每次生成的都不一样。如果只要18位,建议还是用sequence。
#5
因为sys_guid()有字母,而我只要纯数字。
#6
你可以做个字母到数字的对换。。。
#1
随机数不能保证不重复,即然你已经使用循环了,使用v_num来拼接不就行了
v_id := '000000000000' || to_char(SYSDATE, 'yyyymmddhh24miss') || lpad(to_char(v_num), 4, '0');
或者使用序列sequence来生成ID保证唯一性。
v_id := '000000000000' || to_char(SYSDATE, 'yyyymmddhh24miss') || lpad(to_char(v_num), 4, '0');
或者使用序列sequence来生成ID保证唯一性。
#2
1:且不说别的
'000000000000'||to_char(sysdate,'yyyymmddhh24miss')TRUNC(DBMS_RANDOM.value(1000,9999)); 这里就有错误
改为
'000000000000'||to_char(sysdate,'yyyymmddhh24miss')||TRUNC(DBMS_RANDOM.value(1000,9999))
2.DBMS_RANDOM.value(1000,9999)用这个本来就有重复的
要想唯一可以这样
v_id :='000000000000'||to_char(sysdate,'yyyymmddhh24miss')||to_char(v_num);
或者用序列加触发器
#3
v_id :='000000000000'||to_char(sysdate,'yyyymmddhh24miss')||to_char(v_num,'fm0000');
#4
有个系统函数你可以用一下,sys_guid() 可以生成32位的唯一数,保证每次生成的都不一样。如果只要18位,建议还是用sequence。
#5
因为sys_guid()有字母,而我只要纯数字。
#6
你可以做个字母到数字的对换。。。