用到的大概功能:Oracle 的随机数、随机日期和时间,Oracle的trunc和dbms_random.value随机取n条数据, INSERT INTO SELECT 的使用,oracle 查询按月份分组,oracle批量update
需求:要给一张修改记录表(CARD_PERSON_MODIFY_RECORD)增加20多万条数据,保证其中的修改时间字段在每个月至少有两万左右的数据,关联表为(CARD_PERSON),关联字段为前表中的CARD_PERSON_ID
别问我为什么要弄虚作假 =。=
生成规定时间段内(今年一月份到今天,每天早上九点到下午六点)的随机日期
SELECT to_date(TRUNC(DBMS_RANDOM.VALUE(to_number(to_char(to_date('20170101',
'yyyymmdd'),
'J')),
to_number(to_char(to_date('20171115',
'yyyymmdd') + 1,
'J')))),
'J') + DBMS_RANDOM.VALUE(1350, 2700) / 3600 prize_time
FROM dual;
貌似最麻烦的一个环节已经解决了,那么我们下面弄到那20万条数据吧,然后再统一update一下就好了
insert into card_person_modify_record
(id, card_person_id, is_enabled, system_users_id, system_users_name)
select seq_card_person_modify_record.nextval,
c.id,
c.is_enabled,
2,
'admin02'
from (select id, is_enabled
from card_person
order by trunc(dbms_random.value(1, 2000000)))
c
where rownum <= 200000
select * from card_person_modify_record
**把这二百万数据随机排序取前20万。
然后我们把空缺的“修改时间”补上去**
update card_person_modify_record t
set t.modify_date = to_date(TRUNC(DBMS_RANDOM.VALUE(to_number(to_char(to_date('20170101',
'yyyymmdd'),
'J')),
to_number(to_char(to_date('20171115',
'yyyymmdd') + 1,
'J')))),
'J') + DBMS_RANDOM.VALUE(1350, 2700) / 3600
where t.modify_date is null
最后我们统计下每个月都是多少
select to_char(modify_date,'yyyy-mm'),count(*) from card_person_modify_record group by to_char(modify_date,'yyyy-mm')
order by to_char(modify_date,'yyyy-mm');
参考文章:
Oracle的trunc和dbms_random.value随机取n条数据
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解(SQL数据库和Oracle数据库的区别)