postgresql存储函数实现大量模拟数据插入
生活随笔
收集整理的這篇文章主要介紹了
postgresql存储函数实现大量模拟数据插入
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.準(zhǔn)備數(shù)據(jù):
創(chuàng)建兩張表count_group和person_face_flow
-- DROP TABLE public.count_group;CREATE TABLE public.count_group (id character varying COLLATE pg_catalog."default" NOT NULL,name character varying(64) COLLATE pg_catalog."default" NOT NULL,type integer NOT NULL,is_delete integer NOT NULL DEFAULT 0,area integer,create_time timestamp with time zone,update_time timestamp with time zone,region_id character varying(48) COLLATE pg_catalog."default" NOT NULL,CONSTRAINT count_group_pkey PRIMARY KEY (id) )-- DROP TABLE public.person_face_flow;CREATE TABLE public.person_face_flow (id character varying(36) COLLATE pg_catalog."default" NOT NULL,group_id character varying(36) COLLATE pg_catalog."default" NOT NULL,stat_time timestamp without time zone,create_time timestamp without time zone NOT NULL,update_time timestamp without time zone NOT NULL,in_number integer,out_number integer,gender character varying(20) COLLATE pg_catalog."default",age_type character varying(20) COLLATE pg_catalog."default",CONSTRAINT person_face_flow_pkey PRIMARY KEY (id) )2.生成模擬數(shù)據(jù)的腳本:
3.總結(jié)說明
1. 生成序列
SELECT generate_series(1,10)generate_series函數(shù)
| generate_series(start, stop) | int 或 bigint | setof int 或 setof bigint(與參數(shù)類型相同) | 生成一個數(shù)值序列,從start 到 stop,步進(jìn)為一 |
| generate_series(start, stop, step) | int 或 bigint | setof int 或 setof bigint(與參數(shù)類型相同) | 生成一個數(shù)值序列,從start 到 stop,步進(jìn)為step |
| generate_series(start, stop, step_interval) | timestamp or timestamp with time zone | timestamp 或 timestamp with time | 生成一個數(shù)值序列,從start 到 stop,步進(jìn)為step |
2. 生成字符串
生成36位的UUID字符串
SELECT uuid_generate_v4()生成32位隨機(jī)字符串,但是測試發(fā)現(xiàn)如循環(huán)100萬次,會出現(xiàn)重復(fù),所以最好可以選擇序列或者36位uuid去除-線
select md5(random()::text)生成重復(fù)字符串
-- abc重復(fù)多次的字符串SELECT repeat('abc',(random()*4)::integer);-- 重復(fù)2次的MD5字符串select repeat(md5(random()::text),2);連接符
select concat('a', ' ', 'b');3. 生成隨機(jī)數(shù)
生成100以內(nèi)的隨機(jī)數(shù)字
select (random()*100)::int生成100以內(nèi),總位數(shù)為4,小數(shù)點(diǎn)后2位的小數(shù)
SELECT (random()*100.)::numeric(4,2);4. 生成日期
SELECT date(generate_series(now(), now() + '1 week', '1 day')); select generate_series(to_date('20130403','yyyymmdd'), to_date('20130404','yyyymmdd'), '3 hours'); ------------------------2013-04-03 00:00:00+082013-04-03 03:00:00+082013-04-03 06:00:00+082013-04-03 09:00:00+082013-04-03 12:00:00+082013-04-03 15:00:00+082013-04-03 18:00:00+082013-04-03 21:00:00+082013-04-04 00:00:00+08 (9 rows)5. 自定義函數(shù)
生成隨機(jī)漢字
create or replace function gen_hanzi(int) returns text as $$ declare res text; begin if $1 >=1 then select string_agg(chr(19968+(random()*20901)::int),'') into res from generate_series(1,$1); return res; end if; return null; end; $$ language plpgsql strict; --輸出漢字select gen_hanzi(10) from generate_series(1,10);生成隨機(jī)身份證號
create or replace function gen_id(a date, b date) returns text as $$ select lpad((random()*99)::int::text, 2, '0') || lpad((random()*99)::int::text, 2, '0') || lpad((random()*99)::int::text, 2, '0') || to_char(a + (random()*(b-a))::int, 'yyyymmdd') || lpad((random()*99)::int::text, 2, '0') || random()::int || (case when random()*10 >9 then 'X' else (random()*9)::int::text end ) ; $$ language sql strict; --輸出身份證號select gen_id('1900-01-01', '2017-10-16') from generate_series(1,10); -------------------- 25614020061108330X 49507919010403271X 96764619970119860X 915005193407306113 551360192005045415 430005192611170108 299138191310237806 95149919670723980X 542053198501097403 482334198309182411 (10 rows)生成隨機(jī)數(shù)組
create or replace function gen_rand_arr(int,int) returns int[] as $$ select array_agg((random()*$1)::int) from generate_series(1,$2); $$ language sql strict; --輸出數(shù)組 select gen_rand_arr(100,10) from generate_series(1,10); --------------------------------- {69,11,12,70,7,41,81,95,83,17} {26,79,20,21,64,64,51,90,38,38} {3,64,46,28,26,55,39,12,69,76} {66,38,87,78,8,94,18,88,89,1} {6,14,81,26,36,45,90,87,35,28} {25,38,91,71,67,17,26,5,29,95} {82,94,32,69,72,40,63,90,29,51} {91,34,66,72,60,1,17,50,88,51} {77,13,89,69,84,56,86,10,61,14} {5,43,8,38,11,80,78,74,70,6} (10 rows)例:
select generate_series(1,5), (random()*100)::int, (random()*20.)::numeric(4,2), gen_hanzi(3), uuid_generate_v4()結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的postgresql存储函数实现大量模拟数据插入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java线上排查利器arthas
- 下一篇: 帮你梳理springboot所有常用注解