ORACLE-批量生成32位不同的ID【如:f54f5560-e08e-4412-8c38-dab5ae8ad011】

今日系统存在一个报表故障,发现一些数据缺失了。一查,原来是数据没有同步过去。要恢复,只能手工同步了。
查了下相关表的结构和数据,发现有一列ID的值是这种形式的193ded83-f22c-11e8-b606-02007b91000e,要想批量插入数据,就得先生成这个ID,而且要保证生成的不重复,不然可能会因为主键约束插入不成功。
上网看看大神怎么操作的,发现大部分讲的不是很清楚,找了半天,终于给我看到个感觉可以成功的方法。有一个函数sys_guid()
于是,满怀心情的试验一波。
select sys_guid() from dual;
在这里插入图片描述
发现和我想要的结果还是有些差异的。根据分析数据193ded83-f22c-11e8-b606-02007b91000e,发现几个差异:
①大写变小写 lower()
②中间有- ||
③字符串按长度8、4、4、4、12进行分隔字符串 substr(str,m,n)
一波操作下去,成功了!!!

select
substr(lower(sys_guid()),1,8)||'-'||
substr(lower(sys_guid()),9,4)||'-'||
substr(lower(sys_guid()),13,4)||'-'||
substr(lower(sys_guid()),17,4)||'-'||
substr(lower(sys_guid()),21,32) id
from dual;

在这里插入图片描述
问题又来了,我要插入的数据有24行,难道我重复运行这个语句24次,然后每次还要复制下来???我太懒了。。。又上网搜了一波,发现并没有什么解决方法。
灵机一动,好像有一个稍微便捷的方法。
步骤如下:
①创建一个表test,只有id列

create table test(
id varchar2(50)
);

②insert into test select子句

--插入
insert into test
select
substr(lower(sys_guid()),1,8)||'-'||
substr(lower(sys_guid()),9,4)||'-'||
substr(lower(sys_guid()),13,4)||'-'||
substr(lower(sys_guid()),17,4)||'-'||
substr(lower(sys_guid()),21,32)
from dual;
--提交事务
commit;
--查询结果
select * from test;

③用excel工具批量创建这个插入语句,然后在命令行窗口运行。

-- excel批量生成再运行,最后要记得提交。
insert into test
select
substr(lower(sys_guid()),1,8)||'-'||
substr(lower(sys_guid()),9,4)||'-'||
substr(lower(sys_guid()),13,4)||'-'||
substr(lower(sys_guid()),17,4)||'-'||
substr(lower(sys_guid()),21,32)
from dual;

终于,得到了以下的ID列。
在这里插入图片描述

--凑字数,这里给5次
insert into test
select
substr(lower(sys_guid()),1,8)||'-'||
substr(lower(sys_guid()),9,4)||'-'||
substr(lower(sys_guid()),13,4)||'-'||
substr(lower(sys_guid()),17,4)||'-'||
substr(lower(sys_guid()),21,32)
from dual;
insert into test
select
substr(lower(sys_guid()),1,8)||'-'||
substr(lower(sys_guid()),9,4)||'-'||
substr(lower(sys_guid()),13,4)||'-'||
substr(lower(sys_guid()),17,4)||'-'||
substr(lower(sys_guid()),21,32)
from dual;
insert into test
select
substr(lower(sys_guid()),1,8)||'-'||
substr(lower(sys_guid()),9,4)||'-'||
substr(lower(sys_guid()),13,4)||'-'||
substr(lower(sys_guid()),17,4)||'-'||
substr(lower(sys_guid()),21,32)
from dual;
insert into test
select
substr(lower(sys_guid()),1,8)||'-'||
substr(lower(sys_guid()),9,4)||'-'||
substr(lower(sys_guid()),13,4)||'-'||
substr(lower(sys_guid()),17,4)||'-'||
substr(lower(sys_guid()),21,32)
from dual;
insert into test
select
substr(lower(sys_guid()),1,8)||'-'||
substr(lower(sys_guid()),9,4)||'-'||
substr(lower(sys_guid()),13,4)||'-'||
substr(lower(sys_guid()),17,4)||'-'||
substr(lower(sys_guid()),21,32)
from dual;

通过以上步骤,就可以批量生成ID了。

高能预警:

①如果只是单纯的生成ID,建议在本地Oracle库上操作,不要直接在生产环境上建表,插入。
②这种插入的方法仅适用1000条数据的插入。如果数据量是上万的,在生产环境插入,可能会对数据库性能造成影响。所以不建议这样操作。
③在进行DML操作时,建议先查再改。确保修改数据的正确性。

如果有大神路过,可以在评论区评论更便捷的方法,互相学习。

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/106252216